博主主页: 码农派大星.
数据结构专栏:Java数据结构
数据库专栏:数据库
JavaEE专栏:JavaEE
软件测试专栏:软件测试
关注博主带你了解更多知识
目录
1.事务
1.1 什么是事务?
1.2 为什么需要事务?
1.3 事务的操作
2. Spring 中的事务
1. 编程式事务
2. 声明式事务@Transactional
1. 添加依赖
2. 在需要事务的⽅法上添加 @Transactional 注解就可以实现
@Transactional 作⽤
@Transactional 详解
rollbackFor
编辑
3. Spring事务隔离级别
4. Spring 事务传播机制
4.1 什么是事务传播机制
4.2 事务的传播机制种类
总结
1.事务
1.1 什么是事务?
事务会把所有的操作作为⼀个整体,⼀起向数据库提交或者是撤销操作请求.所以这组操作要么同时成 功,要么同时失败
1.2 为什么需要事务?
程序开发时,也会有事务的需求
⽐如转账操作:
第⼀步:A账⼾-100元.
第⼆步:B账⼾+100元
如果没有事务,第⼀步执⾏成功了,第⼆步执⾏失败了,那么A账⼾的100元就平⽩⽆故消失了.如果使 ⽤事务就可以解决这个问题,让这⼀组操作要么⼀起成功,要么⼀起失败
1.3 事务的操作
事务的操作主要有三步:
1. 开启事starttransaction/begin(⼀组操作前开启事务)
2. 提交事务:commit(这组操作全部成功,提交事务)
3. 回滚事务:rollback(这组操作中间任何⼀个操作出现异常,回滚事务)
-- 开启事务start transaction;-- 提交事务commit;-- 回滚事务rollback;
2. Spring 中的事务
Spring 中的事务操作分为两类:
1. 编程式事务(⼿动写代码操作事务).
2. 声明式事务(利⽤注解⾃动开启和提交事务)
我们先做准备工作
创建实体类:
创建mapper类:
创建controller类
创建service服务类
1. 编程式事务
Spring ⼿动操作事务和上⾯MySQL操作事务类似
开启事务(获取事务),提交事务,回滚事务
SpringBoot 内置了两个对象:
DataSourceTransactionManager事务管理器,⽤来获取事务(开启事务),提交或回滚事务
TransactionDefinition 是事务的属性,在获取事务的时候需要将TransactionDefinition 传递进去从⽽获得⼀个事务TransactionStatus
@Slf4j
@RequestMapping("/user")
@RestController
public class UserController {@Autowiredprivate DataSourceTransactionManager transactionManager;//定义事务属性@Autowiredprivate TransactionDefinition transactionDefinition;@Autowiredprivate UserService userService;@RequestMapping("/registry")public Boolean registry(String name, String password){//开启事务TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);Integer result = userService.insertUser(name,password);log.info("数据影响行数:"+result);//回滚事务transactionManager.rollback(transaction);//提交事务transactionManager.commit(transaction);return true;}}
测试开始事务,提交事务成功:
2. 声明式事务@Transactional
1. 添加依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency>
2. 在需要事务的⽅法上添加 @Transactional 注解就可以实现
⽆需⼿动开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了没有处理的异常会⾃动回滚事务
@Transactional 作⽤
@Transactional 可以⽤来修饰⽅法或类
修饰⽅法时:只有修饰public⽅法时才⽣效
修饰类时:对@Transactional修饰的类中所有的public⽅法都⽣效
⽅法/类被 @Transactional 注解修饰时,在⽬标⽅法执⾏开始之前,会⾃动开启事务,⽅法执⾏结束之后,⾃动提交事务
如果在⽅法执⾏过程中,出现异常,且异常未被捕获,就进⾏事务回滚操作. 如果异常被程序捕获,⽅法就被认为是成功执⾏,依然会提交事务
@Transactional 详解
@Transactional 注解当中的三个常⻅属性:
1. rollbackFor: 异常回滚属性.指定能够触发事务回滚的异常类型.可以指定多个异常类型
2. Isolation: 事务的隔离级别,默认值为Isolation.DEFAULT
3.propagation: 事务的传播机制.默认值为 Propagation.REQUIRED
rollbackFor
@Transactional 默认只在遇到运⾏时异常和Error时才会回滚,⾮运⾏时异常不回滚.即 Exception的⼦类中,除了RuntimeException及其⼦类
如果我们需要所有异常都回滚,需要来配置@Transactional 注解当中的 rollbackFor 这个属性指定出现何种异常类型时事务进⾏回滚((rollbackFor = Exception.class)
3. Spring事务隔离级别
4. Spring 事务传播机制
4.1 什么是事务传播机制
事务传播机制就是:多个事务⽅法存在调⽤关系时,事务是如何在这些⽅法间进⾏传播的
4.2 事务的传播机制种类
@Transactional 注解⽀持事务传播机制的设置,通过 propagation 属性来指定传播⾏为
Spring 事务传播机制有以下7种:
1. Propagation.REQUIRED :默认的事务传播级别.如果当前存在事务,则加⼊该事务.如果当前没 有事务,则创建⼀个新的事务.
2. Propagation.SUPPORTS :如果当前存在事务,则加⼊该事务.如果当前没有事务,则以⾮事务的 ⽅式继续运⾏.
3. Propagation.MANDATORY :强制性.如果当前存在事务,则加⼊该事务.如果当前没有事务,则 抛出异常.
4. Propagation.REQUIRES_NEW :创建⼀个新的事务.如果当前存在事务,则把当前事务挂起.也 就是说不管外部⽅法是否开启事务, Propagation.REQUIRES_NEW 修饰的内部⽅法都会新开 启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰.
5. Propagation.NOT_SUPPORTED :以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起(不 ⽤).
6. Propagation.NEVER :以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常
7. Propagation.NESTED :如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏. 如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED
总结
Spring中使⽤事务,有两种⽅式:编程式事务(⼿动操作)和声明式事务.其中声明式事务使⽤较多,在 ⽅法上添加 @Transactional 就可以实现了
通过 @Transactional(isolation = Isolation.SERIALIZABLE) 设置事务的隔离级别.Spring中的事务隔离级别有5种
通过@Transactional(propagation =Propagation.REQUIRED)设置事务的传播机制,Spring中的事务传播级别有7种,重点关注 REQUIRED (默认值)和 REQUIRES_NEW和NESTED