1、Spring事务管理分类:
a、编程式事务管理:通过编程的方式来提交事务、回滚事务,这种方式比较灵活,可以更细的管理事务,缺点是在业务逻辑的代码中会参杂事务管理的代码,感觉会比较乱;
b、申明式事务管理:在aop的基础上面通过配置文件中配置事务管理规则的方式来进行事务管理,这种方式就不需要在业务逻辑代码中参杂事务管理的代码,代码逻辑会比较清晰。
2、Spring事务的ACID属性:
a、原子性:要么全部失败,要么全部成功;
b、一致性:在事务前后事务后数据要保持一致性,例如从A账户往B账户打款,这两账户在事务前后总金额要保持一致;
c、隔离性:事务之间不会相互影响;
d、持久性:事务提交后要持久化到数据库。
3、事务运行可能发生的问题:
a、脏读:A事务读取了B事务修改了的数据,但是B事务还没提交,有回滚的可能性,这时A事务就发生了脏读;
b、不可重复读:在同一个事务中两次相同的查询所得的数据不一样,例如:A事务在B事务前有过一次查询,然后再B事务后有过一次查询,B事务对A事务查询的数据做了修改,这时A事务在两次相同查询多得的数据就不一样;
c、幻读:例如A事务对数据库中所有数据某个字段进行修改,与此同时,B事务添加了数据,这个时候执行A事务的用户就会发现,数据没有完全修改,就像幻觉一样。
4、Spring事务的隔离级别
a、ISOLATION_DEFAULT:默认隔离级别,一般都是ISOLATION_COMMITED;
b、ISOLATION_UNCOMMITED:能够读取其他事务还没提交的数据,不能防止脏读,不推荐使用;
c、ISOLATION_COMMITED:只能在其他事务提交后才能读取,能够防止脏读,一般使用这个隔离级别;
d、ISOLATION_READ:同一个事务允许多次相同查询,且查询结果不会受其他事务影响,可以防止脏读和不可重复读;
e、ISOLATION_SERIALIZABLE:各个事务必须同步执行,可以防止脏读、不可重复读、幻读,但性能差。
5、Spring事务的传播行为
a、PROPAGATION_REQUIRED:如果当前存在事务,则加入当前事务,如果不存在事务,则创建一个新的事务;
b、PROPAGATION_REQUIRED_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起;
c、PROPAGATION_SUPPORTS:如果当前存在一个事务,则加入当前事务,如果不存在事务,则以非事务的方式运行;
d、PROPAGATION_NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则挂起;
e、PROPAGATION_NEVER:不使用事务的方式运行,如果当前存在事务,则抛出异常;
f、PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务,如果当前不存在事务,则抛出异常;
g、PROPAGATION_NESTED:如果当前存在事务,则创建一个事务,以嵌套的方式加入当前事务,如果不存在,则该取值等价于PROPAGATION_REQUIRED。