这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
Springboot中事务的使用
- 构建项目
构建一个springboot + mybatis的项目,数据库使用mysl,数据库表是一个简单的student表
- 跑通逻辑
完成简单的插入一条数据的逻辑 并且测试成功
- 测试异常
为该逻辑加入一个异常,让该异常和插入操作在一个方法中,查看当异常出现后,插入操作是否成功
- 测试事务
若不成功,那加上@Transaction事务注解,再次观察发生异常的话,插入是否成功
操作思路写一下后期贴代码 ,学生表 ,实体 , repository 注解版写 语句 。1、插入数据 2、查询最近的 id的数据 3、 controller 除以0,搞一个运行时异常出来看效果。
@Transactional中属性讲解
propagation 设置事务的传播行为
@Transaction(propagation = Propagation.REQUIRED) :如果有事务,那么加入事务,没有的话新建一个(默认情况下)
@Transaction(propagation = Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务
@Transaction(propagation = Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transaction(propagation = Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常
@Transaction(propagation = Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常
@Transaction(propagation = Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务,如果其他bean没有声明事务,那就不用事务
timeout设置事务的超时时间,单位秒
- 属性解释:
当某个业务运行的时间超过你的预期时,可以使用
该属性来让业务抛出异常并强制回滚
- 应用场合
比如银行业务中,当用户进行取现出票失败时,可以使用该属性来强制结束业务,进行回滚,减少用户等待的时间。
isolation设置事务的隔离级别
@Transactional(isolation = Isolation.READ_UNCOMMITTED) 读取未提交数据(会出现脏读,不可重复读)基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED) 读取已提交数据(会出现不可重复读和幻读),Oracle默认级别
@Transactional(isolation = Isolation.REPEATABLE_READ) 可重复读(会出现幻读),MySQL默认级别
@Transactional(isolation = Isolation.SERIALIZABLE) 串行化
事务在实战中的应用场景
应用场景
在商城项目中,往往会存在这两张表:订单表和库存表,那么这两张表在很多业务中都是同事成功或失败的,比如用户下单,退货等操作,所以我们需要将这两个操作放在一个事务中进行控制。
未完待续......