@Transactional:
•可设置的属性:
•value|transactionManager:指定事务管理器。
•propagation:指定该事物的传播属性,默认值是Propagation.REQUIRED。
•isolation:指定事务隔离级别,默认值是Isolation.DEFAULT。
•timeout:该事务的超时时间,默认值为-1,代表使用依赖的事务系统的默认超时时间。
•readOnly:默认值为false,为true表示该事务只读。
•rollbackFor|rollbackForClassName:指定0个或多个Throwable的子类,遇到这些异常必须回滚。默认是RuntimeException和Error及其子类。
•noRollbackFor|noRollbackForClassName:指定0个或多个Throwable的子类,遇到这些异常不会滚。
传播属性介绍:
•REQUIRES_NEW:创建一个新事务,如果之前有事务,挂起。
•REQUIRED :之前有,就是用之前的;之前没有,创建新的。
•SUPPORTS :支持在事务中运行。没有事务也无所谓。
•NOT_SUPPORTED :不支持在事务中运行,如果之前有,挂起。
•MANDATORY :必须在事务中运行,如果之前没有,抛异常。
•NEVER :不能再事务中运行,如果之前有,抛异常。
•NESTED :内嵌事务,如果之前没有事务,和REQUIRED 一样。内嵌事务和外部事务一起提交和回滚,内嵌事务也可以单独回滚。
示例总结:
1. 默认情况下,只有RuntimeException和Error才会回滚。
2. 同时指定rollbackFor和noRollbackFor时,从抛出类的继承关系和指定的rollbackFor和noRollbackFor做比较,从下往上,距离抛出类最近的获胜。如果没有找到,使用默认规则。
3. 只读
3.1 针对下面这种情况,如果在没有事务的方法调用这个方法时,会抛错:java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
3.2 如果是下面这种情况,又不会抛错
3.3 而对于这种新创建一个事务指定了readOnly的,同样会抛错。
4. 内嵌事务(Propagation.NESTED):内嵌事务和外部事务一起提交和回滚,内嵌事务也可以自己回滚。
内嵌自己回滚的示例:
5. rollbackOnly:
下面的示例是一个required的方法调用了另外一个required的方法,被调用的方法在执行DB操作之后,抛了异常。这种情况,第一个方法的操作也会被回滚。
异常:org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only