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
设置不需要回滚的情况,例如有些异常是我们已知的,并且不想让事务回滚,就可以使用该参数,指定出现该异常时,不回滚