@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详解

image

事务隔离级别 isolation

image

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"
当调用方法时,如果系统中不存在一个活动事务且发生了错误,必须确保在访问该方法时已经创建了一个事务。

posted @ 2023-05-03 20:51  sunpeiyu  阅读(2)  评论(0编辑  收藏  举报