Spring事务和事务传播机制
2023-04-18 16:42:26 时间
目录
Spring中事务的实现
1、通过代码的方式手动实现事务
@Autowired
private DataSourceTransactionManager transactionManager;
@Autowired
private TransactionDefinition transactionDefinition;
//1、开启事务
TransactionStatus transactionStatus=transactionManager.getTransaction(transactionDefinition);
//手动设置创建时间和修改时间的默认值
userinfo.setCreatetime(LocalDateTime.now().toString());
userinfo.setUpdatetime(LocalDateTime.now().toString());
//2、回滚事务
//transactionManager.rollback(transactionStatus);
//3、提交事务
transactionManager.commit(transactionStatus);
2、通过注解的方式实现声明式事务
@Transactional
1、可以添加在类上或方法上
2、在方法执行前自动开启事务,在方法执行完(没有任何异常)自动提交事务,但是如果在方法执行期间出现异常,那么将自动回滚事务
@Transactional //声明式事务(自动提交)
@RequestMapping("insert")
public Integer insert(Userinfo userinfo){
//非空效验
if (userinfo==null || !StringUtils.hasLength(userinfo.getUsername())
|| !StringUtils.hasLength(userinfo.getPassword())){
return 0;
}
int result= userService.add(userinfo);
System.out.println("添加:"+result);
return result;
}
2.1、@Transactional作用范围
修饰方法时:只能用到public方法上,否则不生效
修饰类时:表明该注解对该类中所有的public方法都生效
2.2、@Transactional参数说明
参数 | 说明 |
value | 当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器。 |
transactionManager | 当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器. |
propagation | 事务的传播行为默认值为Propagation.REQUIRED |
isolation | 事务的隔离级别,默认值为Isolation. DEFAULT |
timeout | 事务的超时时间,默认值为-1如果超过该时间限制但事务还没有完成则自动回滚事务. |
readOnly | 指定事务是否为只读事务默认值为false;为了忽略那些不需要事务的方法比如读取数据,可以设置read-only为true. |
rollbackFor | 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。 |
rollbackForClassName | 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型. |
noRollbackFor | 抛出指定的异常类型不回滚事务,也可以指定多个异常类型 |
noRollbackForClassName | 抛出指定的异常类型.不回滚事务,,也可以指定多个异常类型 |
2.3、注意事项
当程序中有try-catch。及时程序发生异常,事务也不会回滚
@Transactional //声明式事务(自动提交)
@RequestMapping("insert")
public Integer insert(Userinfo userinfo){
//非空效验
if (userinfo==null || !StringUtils.hasLength(userinfo.getUsername())
|| !StringUtils.hasLength(userinfo.getPassword())){
return 0;
}
int result= userService.add(userinfo);
System.out.println("添加:"+result);
try {
int num=10/0;
} catch (Exception e) {
System.out.println(e.getMessage());
}
return result;
}
解决方法:
1、将异常抛出去
@Transactional //声明式事务(自动提交)
@RequestMapping("insert")
public Integer insert(Userinfo userinfo){
//非空效验
if (userinfo==null || !StringUtils.hasLength(userinfo.getUsername())
|| !StringUtils.hasLength(userinfo.getPassword())){
return 0;
}
int result= userService.add(userinfo);
System.out.println("添加:"+result);
try {
int num=10/0;
} catch (Exception e) {
//将异常继续抛出
throw e;
}
return result;
}
2、使用代码手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
2.4、@Transactional工作原理
事务隔离级别
1、事务特性
原子性
一致性
持久性
隔离性
2、Spring中设置事务隔离级别
2.1、MySQL事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(READ UNCOMMITTED) | √ | √ | √ |
读已提交(READ COMMITTED) | × | √ | √ |
可重复读(REPEATABLE READ) | × | × | √ |
串行化(SERIALIZABLE) | × | × | × |
2.2、Spring事务隔离级别
1. Isolation.DEFAULT: 以连接的数据库的事务隔离级别为主。
2. Isolation.READ. _UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读。
3. Isolation.READ. COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。
4. Isolation.REPEATABLE READ:可重复读,解决了不可重复读,但存在幻读(MySQL默认级别)。
5. Isolation.SERIALIZABLE: 串行化,可以解决所有并发问题,但性能太低。
通过设置@Transactional里的isolation属性即可
Spring事务传播机制
spring事务传播机制分类
1、Propagation.REQUIRED
默认传播机制,如果调用链存在事务,则加入事务,如果不存在则创建事务
2、Propagation.SUPPORTS
如果调用链存在事务,则加入事务;如果不存在则非事务方式运行
3、Propagation.MANDATORY
强调必须有事务
4、Propagation.REQUIRES_NEW
5、Propagation.NOT_SUPPORTED
6、Propagation.NEVER
7、Propagation.NESTED
嵌套事务和加入事务的区别:
1、整个事务如果全部执行成功,二者的结果是一样的;
2、如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部会滚,不会影响上一个方法中执行的结果
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击