事务传播行为(Propagation Behavior): 当一个事务方法调用另一个事务方法时,这个事务应该如何进行。
Spring定义了7种传播行为:
PROPAGATION_REQUIRED: 需要事务。如果有事务则加入当前事务,如果没有事务则创建一个事务。
PROPAGATION_REQUIRED_NEW: 需要新事物。不管当前有没有事务都会新创建一个事务。
PROPAGATION_SUPPORTS: 支持事务。如果当前有事务,则加入当前事务,如果没有事务则按照非事务方式运行。
PROPAGATION_NOT_SUPPORTED: 不支持事务。如果当前有事务,则挂起当前事务。
PROPAGATION_MANDATORY: 将事务委托给调用方,因此需要调用方以事务方式运行。如果当前没有事务则会报错。
PROPAGATION_NESTED: 不管当前有没有事务都会启动一个新事务,如果当前有事务则与当前事务共用一个commit操作。
PROPAGATION_NEVER: 不能运行在事务中,如果当前存在事务则抛出异常。
Spring @Transational 注解的使用方法:
参数 | 类型 | 说明 |
---|---|---|
value | String | 可选,用来指定所使用的的事务管理器的名字 |
propagation | ENUM:Propagation | 可选,事务传播属性设置 |
isolation | ENUM:Isolation | 可选,指定事务隔离级别,仅限于独立新创建事务的场景(REQUIERD, REQUIRED_NEW) |
timeout | int | 可选,指定超时时间,精确到秒。仅限于独立创建新事物的场景。 |
readOnly | boolean | 可选,事务执行时是否对数据库进行只读操作。 |
rollbackFor | List<Class> | 可选,抛出什么Class时回滚。 |
rollbackForClassName | List<String> | 可选,抛出什么名字的异常时回滚。 |
noRollbackFor | 参见 rollbackFor | |
noRollbackForClassName | 参见 rollbackForClassName |
注意事项:
- @Transactional只在public方法上生效,如果需要在其他访问控制修饰符使用事务还需要其他配置,参见官方文档。
- @Transactional只适合于外部函数调用时才能生效,对象中的内部方法互相调用时不会起作用。