加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

JDBC的进化3--补充:事务处理

发布时间:2020-12-13 20:15:45 所属栏目:PHP教程 来源:网络整理
导读:接着JDBC的进化3,我们来讲数据库事务。 事务: 1组逻辑操作单元,使数据从1种状态变换到另外一种状态。 怎样理解呢? 1组逻辑单元:我认为指的是多条的DML操作,只是1条DML语句的话,对mysql来讲,履行完成功就自动提交了,没成功的话,就没成功喽,这样说来

接着JDBC的进化3,我们来讲数据库事务。
事务:1组逻辑操作单元,使数据从1种状态变换到另外一种状态。
怎样理解呢?
1组逻辑单元:我认为指的是多条的DML操作,只是1条DML语句的话,对mysql来讲,履行完成功就自动提交了,没成功的话,就没成功喽,这样说来,1条DML语句就相当于1个原子,不可再分了。
从1种状态变换到另外一种状态:即这组操作是成功了还是失败了,他们必须同时都成功,有1个失败,就退回到出发点。例如银行的转账,不能1个成功,1个失败吧。
来看看JDBC的事务处理:
先来看看,在甚么时候,事务处理睬开始,甚么时候结束,针对确当然是我们的程序!
事务处理的开始:
以第1个DML语句履行为开始
事务处理的结束:
1.提交或回滚
2.正常结束
3.程序异常
来1个正确的例子:

@Test public void test() { String sql1 = "UPDATE user_table SET balance = balance - 100 WHERE `user` = ?"; String sql2 = "UPDATE user_table SET balance = balance + 100 WHERE `user` = ?"; Object[] obj1 = new Object[1]; obj1[0] = new String("AA"); Object[] obj2 = new Object[1]; obj2[0] = new String("BB"); Connection conn = null; try { conn = JDBCUtils.getConnection(); conn.setAutoCommit(false); prepareUpdate(conn,sql1,obj1); prepareUpdate(conn,sql2,obj2); conn.commit(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.close(null,null,conn); } } public int prepareUpdate(Connection conn,String sql,Object... args) { // get preparedStatement's object PreparedStatement ps = null; // execute the ps int rows = 0; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1,args[i]); } rows = ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.close(ps,null); } // return return rows; }

这就是1个正确的事务处理,保证了两个更新都成功,不会由于断开连接或是异常的出现而使数据更新出错。

要测试的话,在两个update中间加上异常就能够了。需要注意的是,不能自定义异常,假设自定义异常,下面的代码就永久运行不到,回报编译毛病。(自定义异常相当于return语句)

补充1点:
事务的ACID(acid)属性
1.原子性
2.1致性
3.隔离性
4.持久性

事务的隔离级别:
产生的问题:
1.脏读
2.不可重复读
3.幻读

隔离级别:

这里写图片描述


Oracle 支持的 2 种事务隔离级别:READ COMMITED,SERIALIZABLE。 Oracle 默许的事务隔离级别为: READ COMMITED
Mysql 支持 4 种事务隔离级别. Mysql 默许的事务隔离级别为: REPEATABLE READ

查看和设置事务级别:
查看当前的隔离级别: SELECT @@tx_isolation;
设置当前 mySQL 连接的隔离级别:
set transaction isolation level read committed;
设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed;

好了,over。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读