@Transactional注解解析
@Transactional注解默认:
隔离级别:Connection.TRANSACTION_REPEATABLE_READ,可重复读的隔离级别,
传播机制:Propagation.REQUIRED,如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务
readOnly
首先要弄清楚如果一个接口中有多个查询,需要不需要加@Transactional ?如果不需要,会不会出现多个sql查询,数据不一致的情况?
//关闭mybatis的二级缓存@Overridepublic User findUser() throws Exception {userMapper.findUser();return userMapper.findUser();}
如果在两次查询中,出现了数据更新,第二条查询会查询到最新的数据,这就造成了前后两个查询数据不一致的情况
@Override@Transactionalpublic User findUser() throws Exception {userMapper.findUser();return userMapper.findUser();}
加上@Transactional之后:
其第二次查询会去mybatis的一级缓存中拿, 符合可重复读的隔离级别,保证了数据一致性,但是添加事务,就要写undo.log,写undo log就要消耗性能,如果不让它写undo log呢,则设置:read_only = true,是对性能的一种优化
timeout
当数据库的事务请求并发压力,有些事务请求的sql迟迟不能做出响应的处理,为了防止数据库出现了锁等待,或者死锁的情况,我们需要给相关业务方法添加事务超时
@Override@Transactional(timeout = 2)public User findUser() throws Exception {userMapper.findUser();userMapper.updateUser();Thread.sleep(5000);return userMapper.findUser();}
rollbackFor
@Transactional默认只是对运行时异常进行捕捉,捕捉到了则进行回滚
<update id="updateUser" >update user set username = 'aaa' where id = 1</update>
@Override@Transactionalpublic User findUser() throws Exception {userMapper.findUser();userMapper.updateUser();if(true){throw new IOException("ssssss");}return userMapper.findUser();}
像IOException是比较普遍的异常,文件读写,都可能会发生
但是数据库里面的值被修改了:
所以需要添加这个@Transactional(rollbackFor = Exception.class),捕捉了Exception异常才会回滚
在方法中捕捉了异常,会事务失效,不会进行回滚
@Override@Transactional(rollbackFor = Exception.class)public User findUser() throws Exception {userMapper.findUser();userMapper.updateUser();try {if(true){throw new IOException("ssssss");}}catch (Exception e){e.printStackTrace();}return userMapper.findUser();}
虽然程序报错了,但是异常被try catch,依然不会进行回滚,数据被修改了
@Transactional注解解析相关推荐
- Transactional注解原理解析
什么是@Transactional? @Transactional是Spring这种用于处理事务的注解,基于拦截器进行commit或rollback 使用例子 下面举一个加了@Transactiona ...
- spring@Transactional注解事务不回滚不起作用无效的问题处理
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactio ...
- SSM框架中使用Spring的@Transactional注解进行事务管理
一 介绍 在企业级应用中,保护数据的完整性是非常重要的一件事.因此不管应用的性能是多么的高.界面是多么的好看,如果在转账的过程中出现了意外导致用户的账号金额发生错误,那么这样的应用程序也是不可接受的 ...
- @Transactional注解事务不回滚不起作用无效
@Transactional注解事务不回滚不起作用无效 以下内容均来自http://blog.csdn.net/u011410529/article/details/54287307 转载 这几天在项 ...
- Spring Boot Transactional注解源码阅读笔记(二)
在源码笔记(一)中,我们留下了几个问题: Spring Boot是怎么扫描到我们的bean里面有 Transactional 这个注解,并且把 InfrastructureAdvisorAutoP ...
- @Transactional注解详细使用
目录 一.@Transactional 注解使用注意事项 二.Spring事务的传播规则 三.微服务开发案例 四.Spring 事务源码深度解析 一.@Transactional 注解使用注意事项 @ ...
- 【BUG】@Transactional注解在同类方法调用中不生效
后台代码 今天做系统开发的时候,遇到了一个BUG:@Transactional注解在同类方法调用中不生效 代码如下: /*** @description: 快递100接口服务类* @date 2021 ...
- @Transactional注解最容易忽视的三个失效场景!
@Transactional注解在以下场景中使用,是会失效的,切记! 1.非public方法 spring对注解事务的方法进行校验,修饰符是不是public,不是 public则不会获取@Transa ...
- @aspect注解类不生效_springboot:@Transactional注解 VS @Service注解
1. Transactional注解与Service/Component注解冲突? 之前遇到一个神奇的事情--用Transactional注解的方法,数据处理了一半,后面的数据处理抛出异常后,没有回滚 ...
- 一口气说出 6 种 @Transactional 注解的失效场景
一.事务 事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 编程式事务:是指在代码中手动的管理事务的提交.回滚等操作,代码侵入性比较强, ...
最新文章
- 【JavaSE】双向链表的实现与讲解
- 如何用cmd命令控制mysql数据库
- python pycurl_简单谈谈Python的pycurl模块_python
- linux下Eclipse+CDT开发环境配置与使用
- 锲而不舍 —— M 是怎样找工作的?(八)
- 知道坐标matlab三维作图,已知点坐标,要求根据坐标作出三维曲面图
- 《Linux命令行与shell脚本编程大全》第十八章 图形化桌面环境中的脚本编程
- python列表语法_python学习之列表语法
- 西门子S7-300PLC采用博途V14编程程序,附带博途WINCC上位机,项目内容甲醛生产线项目,模拟量处理,电机控制等
- (休息几天)读曼昆之微观经济学——供给需求和政府政策
- 使用python的sklearn包实现CCA(典型相关分析)
- linux终端快捷键(持续更新)
- 投票和排名系统C语言顺序表,电视大赛观众投票及排名系统C语言设计.docx
- 更改C盘用户目录下的用户名(亲测有效)
- 老主板怎么接机箱前面的USB和mic
- Linux期末考试必考内容,linux期末考试
- LeetCode第127题—单词接龙—Python实现
- 关于pycharm找不到已经安装的模块问题的解决方案module ImportError
- 2020年远程面试全攻略
- EM算法推断混合高斯模型参数
热门文章
- Tita 绩效宝:掌握绩效考核对话
- 100个在线生信小工具
- 【北京迅为】i.MX6ULL终结者虚拟机安装Ubuntu系统
- word2016 图片去底灰_Word2016中为图片去除背景的方法
- ps人物碎片化飞溅效果特效怎么做
- u盘插在服务器上显示加载失败,U盘加载失败怎么解决
- 无人机倾斜摄影技术应用(文末附作业指导书)
- 看看淘宝的工程师如何评论12306
- 微信公众号python_微信公共平台框架-python(支持多账号)
- java linux 消息队列_我的第一个Linux程序----利用消息队列来实现IPC