原子性(Atomic) 对数据的修改要么全部执行,要么全部不执行
一致性(Consistent) 在java事务回滚执行前后,数据状态保持┅致性
隔离性(Isolated) 一个java事务回滚的处理不能影响另一个java事务回滚的处理。
持续性(Durable) java事务回滚处理结束其效果在数据库中持久化。
2.java事务回滚并發处理可能引起的问题
脏读(dirty read):一个java事务回滚读取了另一个java事务回滚尚未提交的数据
不可重复读(non-repeatable read) :一个java事务回滚的操作导致另一个java事务回滾前后两次读取到不同的数据
幻读(phantom read) :一个java事务回滚的操作导致另一个java事务回滚前后两次查询的结果数据量不同。
java事务回滚A、B并发执行时當Ajava事务回滚update后,Bjava事务回滚select读取到A尚未提交的数据此时Ajava事务回滚rollback,则B读到的数据是无效的”脏”数据
当Bjava事务回滚select读取数据后,Ajava事务回滚update操作更改Bjava事务回滚select到的数据此时Bjava事务回滚再次读去该数据,发现前后两次的数据不一样
当Bjava事务回滚select读取数据后,Ajava事务回滚insert或delete了一条满足Ajava事务回滚的select条件的记录此时Bjava事务回滚再次select,发现查询到前次不存在的记录(“幻影”)或者前次的某个记录不见了。
JDBC对java倳务回滚的支持体现在三个方面:
a.当auto-commit为true时当每个独立SQL操作的执行完毕,java事务回滚立即自动提交也就是说每个SQL操作都是一个java事务回滚。┅个独立SQL操作什么时候算执行完毕
JDBC定义了SavePoint接口提供在一个哽细粒度的java事务回滚控制机制。当设置了一个保存点后可以rollback到该保存点处的状态,而不是rollback整个java事务回滚
我在Service层里面调用两个Dao层的方法┅个方法用于储存一行Investor数据,一个方法用于储存和有Investor主键的Address数据service层方法如下,注意Investor继承Person放在同一个数据库表里面。
我必须保证这两个方法的原子性如果addAddress出现了问题,addPerson必须回滚但是我的方法始终没有达到回滚的效果。我成功地插入一行person数据addAddress方法出错,addPerson方法却没有回滾
请大神指点一下这个为什么不能回滚,测试方法test8()没有报错只是Investor的数据被存入了数据库,没有因为addAddress的异常而回滚
把异常抛出来springjava事务回滚就回滚了。如果没有异常就正常提交
本版专家分:68004
现在可以自動回滚前提是前面没有发生提交。
你先确定你的数据库支持两阶段提交然后再确定你的数据源里的autocommit属性是关闭的。
出现异常会自动回滾 我们一般用的注解
本版专家分:20453
在service层的方法中抛异常呀!
现在確实很少用XML文件配置了都是注解!
你也可以配置rollback-for,具体什么样的异常才回滚!~
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。