JDBC使用事务

JDBC使用事务

JDBC设置事务隔离级别

JDBC中通过Connection提供的方法设置事务隔离级别:

Connection.setTransactionIsolation(int level)

leve参数可选值如下:

Connection.TRANSACTION_READ_UNCOMMITTED 1(读未提交数据)
Connection.TRANSACTION_READ_COMMITTED 2(读已提交数据)
Connection.TRANSACTION_REPEATABLE_READ 4(可重复读)
Connection.TRANSACTION_SERIALIZABLE 8(串行化)
Connection.TRANSACTION_NONE 0(不使用事务)

提示:在开发中,一般情况下不需要修改事务隔离级别

模板(方法)

...
conn.setAutoCommit(false); 关闭自动提交, 默认打开事务
...执行多条SQL
conn.commit(); // 手动提交
...
// name是一个字符串, 是回滚点的名字, 这个方法返回一个SavePoint对象
SavePoint point = conn.setSavepoint(name); // 设置回滚点
conn.rollback(point); // 回滚, 参数是个SavePoint对象

conn.rollback(); // 回滚到上次提交的状态

案例

案例用到了 JDBC工具类

public class TestTx {
	public static void main(String[] args) throws SQLException {
	    Connection conn = null;
	    Statement stat = null;
	    ResultSet rs = null;
	    try {
	        //1.获取连接
	        conn = JdbcUtil.getConn();
	        //2.关闭JDBC自动提交事务(默认开启事务)
	        conn.setAutoCommit(false);
	        //3.获取传输器
	        stat = conn.createStatement();
	        /* ***** A给B转账100元 ***** */
	        //4.A账户减去100元
	        String sql = "update acc set money=money-100 where name='A'";
	        stat.executeUpdate(sql);
	        //int i = 1/0; // 让程序抛出异常,中断转账操作
	        //5.B账户加上100元
	        sql = "update acc set money=money+100 where name='B'";
	        stat.executeUpdate(sql);   
	        //6.手动提交事务
	        conn.commit();
	        System.out.println("转账成功!提交事务...");
	    } catch (Exception e) {
	        e.printStackTrace();
	        //一旦其中一个操作出错都将回滚,使两个操作都不成功
	        conn.rollback();
	        System.out.println("执行失败!回滚事务...");
	    } finally{
	        JdbcUtil.close(conn, stat, rs);
	    }
	}
}
posted @ 2020-06-17 14:40  zpk-aaron  阅读(212)  评论(0编辑  收藏  举报