发表于: 2020-04-09 13:04:15
1 1391
JDBC事务
事务(Transaction):是并发控制的单元,是用户定义的一个操作序列。这些操作要么都做,要么都不做。不可分割。事务通常是以begin transaction开始,以commit或rollback结束。commit表示提交.
事务的特性
1、原子性(atomicity):事务是数据库的逻辑工作单位,并且必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行
2、一致性(consistency):事务在完成时,必须是所有的数据保持一致的状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性
3、隔离性(isolation):一个事务的执行不能被其他事务所影响
4、持久性(durability):一个事务一旦提交,事务的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤销所做的更改
事务并发处理可能的问题
1、脏读(dirty read):一个事务读取了另一个事务尚未提交的数据
2、不可重复读(non-repeatable read):一个事务的操作导致另一个事务前后两次读到不同的数据
3、幻读(phantom read):一个事务的操作导致另一个事务前后两次查询的结果数据量不同
举例:
事务A、B并发执行时:
- 当A事务update后,B事务select读取到A尚未提交的数据,此时A事务rollback,则B读到的数据是无效的脏数据
- 当B事务select读取数据后,A事务update操作更改B事务select到的数据,此时B事务再次读取该数据,发现前后两次的数据不一样
- 当B事务select读取数据后,A事务insert或delete了一条满足A事务的select条件的记录,此时B事务再次select,发现查询到前次不存在的记录,或者前次的某个记录不见
JDBC的事务支持
JDBC对事务的支持体现在三个方面:
1、自动提交模式(auto-commit mode)
Connection提供了一个auto-commit属性来指定事务何时结束
2、当auto-commit为true时,当每个独立SQL操作的执行完毕,事务立即自动提交,也就是说每个SQL操作都是一个事务
一个独立SQL操作什么时候算执行完毕,JDBC规范是这样定义的:
对数据操作语言(DML)和数据定义语言(DDL),语句一执行完就视为执行完毕
3、当auto-commit为false时,每个事务都必须显示调用commit方法进行提交,或者显示调用rollback方法进行回滚。auto-commit默认为true
- SavePoint sp=con.setSavePoint();//设置保存点
- conn.rollback(sp);//返回保存点
- conn.setTransactionIsolation();//设置隔离级别
- conn.getTransactionIsolation();//获取隔离级别
参考链接:http://blog.csdn.net/lhfqq/archive/2010/01/31/5274775.aspx
- private Connection conn = null;
- private PreparedStatement ps = null;
- try {
- conn.setAutoCommit(false); //将自动提交设置为false,默认为true
- ps.executeUpdate("修改SQL"); //执行修改操作
- ps.executeQuery("查询SQL"); //执行查询操作
- conn.commit(); //当两个操作成功后手动提交
- } catch (Exception e) {
- conn.rollback(); //一旦其中一个操作出错都将回滚,使两个操作都不成功
- e.printStackTrace();
- }
评论