Spring声明事务属性
在声明事务时,用到了@Transactional(readOnly = false, propagation = Propagation.REQUIRED)。
中间的参数readOnly,propagation我们称为事务属性。它就是对事务的基本配置。事务属性有五个方面:传播行为,隔离级别,事务超时时间,回滚规则,是否只读。
1,spring支持事务传播行为:propagation(常用以下两个)
① required 使用调用方法的事务,即在当前事务进行,买多本书,但是钱不够,这样的话整个事务回滚,一本书都不会买得到,钱也不会扣。
② requires_new 开启新的事务,而调用方法的事务会被挂起,即每次动作都会开启新的事务,即使出错也可以回滚到当前事务,不会影响到其他事务。
2,隔离级别:isolation
事务并发容易产生问题,比如脏读,不可重复读,幻读等,指定事务隔离级别解决
spring事务隔离级别:读已提交,读未提交,可重复读,序列化等
3,回滚:rollbackFor,noRollbackFor等
默认时spring对所有异常进行回滚,可指定某种异常回滚或者不回滚
noRollbackFor--class[ ]:让原来回滚的异常不回滚
rollbackFor:让原来不回滚的异常回滚
4,只读:readOnly
指定事务只能读取数据而不更新数据,可以帮助数据库引擎优化事务
5,过期:timeout
事务回滚前最多占用多长时间,事务超出指定执行时长后自动终止并回滚
由属性接口TransactionDefinition可以看到,可返回四个基本事务属性:
public interface TransactionDefinition {
int getPropagationBehavior(); // 传播行为。
int getIsolationLevel(); // 隔离级别。事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。
int getTimeout(); // 事务必须在多少秒内完成。
boolean isReadOnly(); // 事务是否只读。事务管理器能够根据这个返回值进行优化,确保事务是只读的
}