Spring有7种传播机制
事务传播行为类型 | 说明 | 备注 |
---|---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,则加入到这个事务(默认) | REQUIRED是和父事务共用connection的方式加入父事务,所以父事务对数据库的修改对子事务是可见的 |
PROPAGATION_SUPPORTS | 支持当前的事务,如果当前没有事务,就以非事务的方式处理 | SUPPORTS是和父事务共用connection的方式加入父事务,所以父事务对数据库的修改对子事务是可见的 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,则抛出异常 | MANDATORY是已和父事务共用connection的方式加入父事务,所以父事务对数据库的修改对子事务是可见的。 |
PROPAGATION_RQUIRES_NEW | 新建事务,如果当前存在事务,则把当前事务挂起 | 父事务对数据的修改是否对子事务有效取决于数据库的隔离级别。新事务发生异常不会导致旧事务回滚,同样如果旧事务在新事务执行完后发生异常也不会导致新事务回滚 |
PROPAGATION_NOT_SUPPORTS | 以非事务的方式执行操作,如果当前存在事务,就把事务挂起 | 父事务对数据的修改是否对子事务有效取决于数据库的隔离级别。如果在事务中,非事务方法发成异常,会抛到有事务的方法,同样会导致事务回滚。 |
PROPAGATION_NEVER | 以非事务的方式执行,如果当前存在事务,则抛出异常 | |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作 | 参见事务回滚1 |
- 事务传播机制只适用于不同的bean之间方法的调用,如果一个bean中的两个方法相互调用则不会用到事务传播机制(同一个bean中,只要一个方法开启的了事务,则它调用的方法就运行在这个事务中)
- 事务方法里如果抛出RuntimeException,则会导致相关事务回滚。
1- 被NESTED标注的方法如果产生RuntimeException会导致事务回滚,与REQUIRED不同的是:如果父方法中catch了这个异常,则不会导致父事务的回滚(通过savePoint机制),如果父方法抛出了这个异常则同样会导致父方法回滚。 - 事务中如果抛出Throwable或则Exception,默认不会导致相关事务回滚,一般都会在异常的地方提交,就有可能出现部分提交的问题。但可以配置rollback-back属性来控制。
1- rollback-for属性只要发生指定异常类或则子类异常都会发生回滚。
2- rollback-for属性对NOT_SUPPORTED无效。因为它本身不在事务中
3- rollback-for属性对REQUIRED_NEW中,只会对本方法有效。
4- rollback-for属性对NESTED,只会回滚到开始这个方法事务的savepoint上。
Spring事务的其他属性配置
- readOnly:这是一个最优化提示,表示事务应该被最优化为只读。在一些情况下,一些事务策略能够起到显著的最优化效果,例如在ORM工具中避免脏读检查(dirty checking)
- Timeout:指定事务超时为几秒。在JTA中将被简单的传递到J2EE服务器的事务协调程序
1- 在XML设置中使用timeout_NNN表示
网友评论