本文已参与「新人创作礼」活动, 一起开启掘金创作之路。 TransactionDefinition 类用来定义事务的属性。
1)传播行为,有 7 种。propgation_required:支持当前事务,若当前没有事务,则创建 一个事务;propgation_supports:支持当前事务,若当前没有事务,则以非事务方式执行; propgation_mandatory:支持当前事务,若当前没有事务,则抛异常;propgation_required_new: 新建事务,若存在当前事务,把当前事务挂起;propgation_not_supported:以非事务的方式 执行,若存在当前事务,则把当前事务挂起;propgation_never:以非事务的方式运行,若 存在当前事务,则抛异常;propgation_nexted:若当前事物存在,则嵌套事务执行。
可以在@Transaction注解中定义propagation ,指定当前事务的传播级别:
@Transactional(propagation = Propagation.NEVER)
2)隔离级别
脏读
不可重复读
幻读
DEFAULT 默认使用后端数据库本身使用的隔离级别。
READ_UNCOMMITTED 读未提交,可能导致脏读、不可重复读或幻读。
READ_COMMITTED 读已提交(Oracle 默认级别),可防止脏读,但不可重复读和幻读仍可能会发生。
REPEATABLE_READ 可重复读(MYSQL默认级别),对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变,可防止脏读和不可重复读,但幻读仍可能发生。
SERIALIZABLE 序列化,确保不发生脏读、不可重复读和幻读,通常是通过完全锁定当前事务所涉及的数据表来完成的,牺牲了性能。
可以在@Transaction注解中定义isolation ,指定当前事务的隔离级别:
@Transactional(isolation = Isolation.READ_COMMITTED)
3)它是否为只读事务。
4)事务超时:为了使应用程序很好的运行,事务不能运行太长时间,因为事务可能涉 及对后端数据库的锁定,所以长时间的事务会不必要的占用数据库资源,事务超时就是事务 的一个定时器,在特定时间内事务没有完成,那么就会自动回滚,而不是一直等待其结束。
5)回滚规则:默认情况下,事务只会遇到 RuntimeException 才回滚。 声明式事务基于 aop,配置事务:@transaction+事务管理器。