Spring中Transaction事务的使用以及注解对应参数

120 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。 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+事务管理器。