一、Spring事务有两种使用方式:
1、编程式事务
使用TransactionTemplate或者底层的PlatformTransactionManager对事务进行管理,常用TransactionTemplate
2、声明式事务
底层基于AOP代理模式,有另种使用方式:1、基于aop和tx的xml配置;2、基于@Transactional注解
Spring事务的传播机制和隔离级别定义都在类:org.springframework.transaction.TransactionDefinition
二、七种传播机制
指的是:如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。
1、PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建新事务,是默认设置;
2、PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行;
3、PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛异常;
4、PROPAGATION_REQUIRES_NEW:创建一个新事务,如果当前存在事务,则把当前事务挂起;
5、PROPAGATION_NOT_SUPPORTED:以非事务控制方式执行,如果当前存在事务,则把当前事务挂起;
6、PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛异常;
7、PROPAGATION_NESTED:嵌套事务,如果当前存在事务则创建一个嵌套事务(是基于提交点的,实际和外层是一个事务),如果当前没有事务,则创建一个事务;
三、五种隔离级别
指的是:若干个并发的事务之间的隔离程度。
1、ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED(可以读取其他事务提交后的数据),MySQL的
2、ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。
3、ISOLATION_READ_COMMITTED:该隔离级别表示一个事务可以读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
4、ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。
5、ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
四、事务超时
所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。
默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。
五、Spring事务回滚规则
默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。可以明确的配置在抛出哪些异常时回滚事务,包括checked异常。也可以明确定义那些异常抛出时不回滚事务。还可以编程性的通过setRollbackOnly()方法来指示一个事务必须回滚,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。