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

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

@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;
    }

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

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

补充一点:
事务的ACID(acid)属性
1.原子性
2.一致性
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。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。