Spring中的事务,主要有以下几个参数
- value:事务名称
 
- transactionManager:事务管理器
 
- propagation:传播行为
 
- isolation:隔离级别
 
- timeout:超时时间,如果在超时时间内事务没有提交,则事务就会被终止(此处会有坑)
 
- readOnly:是否只读事务(需要参考所用的数据源是否支持,如mysql支持只读事务)
 
- rollbackFor:何时回滚
 
- noRollbackFor:在遇到某些异常时,不回滚
 
传播行为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
   | 
 
 
  	REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
  	
 
  	SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
  	
 
  	MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
  	
 
  	REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
  	
 
  	NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
  	
 
 
  	NEVER(TransactionDefinition.PROPAGATION_NEVER),
  	
 
 
 
  	NESTED(TransactionDefinition.PROPAGATION_NESTED);
 
  | 
 
隔离级别
Spring中的隔离级别大致跟mysql的隔离级别一样,为四种,Spring中还多一个缺省值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   | 
 
  	DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
  	
 
 
  	READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
  	
 
 
 
  	READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
  	
 
 
 
  	REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
  	
 
 
 
  	SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
 
  | 
 
超时时间
一般如果不设置的话,默认使用的是数据源的事务超时设置时间。如果数据源也没有设置超时时间的话,就很容易会出现坑。详情参考 事务超时时间导致的坑
最好还是设置一个超时时间,并且把耗时长的行为,移到事务外面
RollBackFor
设置需要回滚的情况,如RuntimeException或者自定义的异常类
NoRollbackFor
设置不需要回滚的情况,例如有些异常是我们已知的,并且不想让事务回滚,就可以使用该参数,指定出现该异常时,不回滚