事务原理

2019-04-03  本文已影响0人  旦暮何枯

事务

事务是并发控制的基本单位,指作为单个逻辑工作单元执行的一系列操作,而这些逻辑工作需要满足 ACID 特性。

JDBC 的事务控制

Connection 对象下的三个方法实现对事务的控制。

setAutoCommit()

commit()

提交事务,使事务中的所有 sql 生效。

rollback()

回滚事务- 回滚到事务开始之前的状态

conn = ds.getConnection();
//            开启事务
            conn.setAutoCommit(false);
            psta = conn.prepareStatement("update user set account = ? where name = ?");
            psta.setInt(1, 0);
            psta.setString(2, "Mike");
            psta.execute();

            psta.setString(1, "100");
            psta.setString(2, "Bob");
            psta.execute();

//            提交事务
            conn.commit();

在事务未提交之前,所有的 sql 语句都不会执行。

设置检查点

setSavePoint()

设置数据库保存点,在出现异常后,可以回复到该点的状态

rollback(SavePoint savePoint)

回复方法

public void Transaction() {
        Connection conn = null;
        PreparedStatement psta = null;
        ResultSet rs = null;
        Savepoint sp = null;

        try {
            conn = ds.getConnection();
//            开启事务
            conn.setAutoCommit(false);
            psta = conn.prepareStatement("update user set account = ? where name = ?");
            psta.setInt(1, 0);
            psta.setString(2, "Mike");
            psta.execute();
            sp = conn.setSavepoint();

            psta.setString(1, "100");
            psta.setString(2, "Bob");
            psta.execute();

//            提交事务
//            conn.commit();
            throw new SQLException();
        } catch (SQLException e) {
            try {
//                回滚事务到检查点
                conn.rollback(sp);
                psta.setString(1, "100");
                psta.setString(2, "GuoSi");
                psta.execute();
                conn.commit();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
//            e.printStackTrace();
        } finally {

            try {
                if (conn != null)
                    conn.close();
                if (psta != null)
                    psta.close();
                if (rs != null)
                    rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }

设置 JDBC 中的隔离级别

getTranactionIlsoLation()

setTranactionIlsoLation()

各个隔离级别内容在 MySQL 45讲 第三讲内容中

『项目地址』:https://github.com/wengfe/JAVA/blob/master/HelloJDBC/src/HelloTransaction.java
上一篇 下一篇

猜你喜欢

热点阅读