@Transactional使用
@Transactional用法
依赖
<dependency> <!--添加Web依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> <!--添加Mybatis依赖 -->
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency><!--添加MySQL驱动依赖 -->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
使用
@Slf4j
@Service
public class TxService {
@Autowired
private PerUserMapper perUserMapper;
@Transactional
public void doTx() {
PerUserEntity perUserEntity = new PerUserEntity();
perUserEntity.setUserId(1L);
perUserEntity.setLoginName("胡歌");
perUserMapper.updatePerUserByUserId(perUserEntity);
int i = 1 / 0;
}
}
@Transactional详解
事务隔离级别 isolation
isolation | 说明 |
---|---|
DEFAULT | 默认隔离级别,使用连接数据库的隔离级别;oracle默认为读已提交、mysql为可重复读 |
READ_UNCOMMITTED | 读未提交,一个事务读取另一个事务修改未提交的数据 |
READ_COMMITTED | 读已提交,一个事务读取另一个事务修改已提交的数据 |
REPEATABLE_READ | 重复读,同一事务多次读取相同数据时,得到结果一致 |
SERIALIZABLE | 串行化,将多个事务按照顺序执行 |
事务传播行为 propagation
propagation="REQUIRED"
如果方法运行时,已经处于一个事务之中,那么直接就加入当前事务中,如果没有,那么就创建一个新的事务(spring默认的事务传播类型)。
propagation="REQUIRES_NEW
不管是否存在新的活动事务,都将会开启一个新的事务。如果一个方法运行多个事务,如果方法运行当前的事务中,那么原事务将挂起。
propagation="NESTED"
支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
propagation="SUPPORTS"
让当前的方法在一个事务中工作,否则方法在没有任务事务的情况下工作。
propagation="NOT_SUPPORTED"
当调用方法时,如果存在一个活动事务,那么该活动事务将被暂停,直到方法调用结束为止。
propagation="NEVER"
当调用方法时,如果系统中存在一个活动事务且发生错误,那么必须在系统中没有任何活动事务的情况下调用方法。
propagation="MANDATORY"
当调用方法时,如果系统中不存在一个活动事务且发生了错误,必须确保在访问该方法时已经创建了一个事务。