jdbctemplate 开启事务_Spring(四):事务管理

事务

首先,我们要知道事务是什么

构成单一逻辑工作单元的操作集合称为事务

事务的ACID特性

  • 原子性:不可分割的最小操作单位,要么同时成功,要么同时失败
  • 一致性:事务操作前后,数据总量不变
  • 隔离性:多个事务之间相互独立
  • 持久性:当事务提交或回滚后,数据会持久化的保存数据

传统编程的事务管理

在传统的JAVA数据库编程中,我们遵循的是打开连接-执行操作-提交事务-关闭连接,如下面的代码:

Connection con = getCon();con.setAutoCommit(false);con.prepareStatement("UPDATE...").execute();con.prepareStatement("UPDATE...").execute();con.commit();//conn.rollback();con.close();

这样就产生了很多模板代码,而且依靠程序员手动提交事务,也十分不可靠

Spring对事务的管理

Spring的事务管理分为两类

  • 声明式事务
  • 编程式事务

Spring定义了一个接口PlatformTransactionManager ,我们只需要使用其实现类,将数据源交其管理,即可实现Spring事务管理

@Configuration@EnableTransactionManagement // 开启事务管理@ComponentScan("wang.ismy.spring")public class Config { @Bean public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUrl("jdbc:mysql:///test"); druidDataSource.setUsername("root"); druidDataSource.setPassword("123"); return druidDataSource; } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource){ return new JdbcTemplate(dataSource); } @Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ return new DataSourceTransactionManager(dataSource); }}

这样,当你在你的service中抛出异常的时候,Spring就会自动帮你进行事务回滚

 @Transactional(rollbackFor = Exception.class) // Spring默认只对运行期异常回滚,加上该属性,则设置回滚的异常类型为Exception public void transfer() { jdbcTemplate.execute("UPDATE account SET amount = 90 WHERE name = 'alice'"); int a=1/0; jdbcTemplate.execute("UPDATE account SET amount = 110 WHERE name = 'bob'"); }

属性

@Transactional注解的一些属性说明如下

  • read-only:是否是只读事务。默认false,不只读。
  • isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。
  • propagation:指定事务的传播行为。
  • timeout:指定超时时间。默认值为:-1。永不超时。
  • rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。没有默认值,任何异常都回滚。
  • no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回滚。没有默认值,任何异常都回滚。

理解事务的传播行为

  • PROPAGATION_REQUIRED
df83e0f960800b327ac717f4c663de33.png

简单来说就是两个被事务管理的方法都将在同一个事务内执行

  • PROPAGATION_REQUIRES_NEW
723f1e055e86bf1ba8fabcc3ad2e13bb.png

而这个传播行为则是开启一个新事务

  • PROPAGATION_NESTED

该传播行为则是与JDBC的保存点一样,它使用了物理事务的保存点的概念

编程式事务

一般来说,编程式事务很少用,它就是把一些对数据库的更新操作放在一起,来达到事务管理的目的

首先,我们需要一个

 @Bean public TransactionTemplate transactionTemplate(PlatformTransactionManager manager){ return new TransactionTemplate(manager); }

在使用的时候注入这个Template进行操作

 public void transfer(){ transactionTemplate.execute((TransactionCallback) status -> { String sql = "UPDATE account SET money = money -200 WHERE uid = 41"; String sql1 = "UPDATE account SET money = money +200 WHERE uid = 45"; jdbcTemplate.update(sql); jdbcTemplate.update(sql1); return null; }); }

这样,也能进行事务管理

原理

最后,来探讨一下Spring事务管理的原理

一句话,事务管理是通过AOP实现的,这个我们通过获取Bean的实际类型就知道

System.out.println(context.getBean(AccountService.class).getClass());// 结果:class wang.ismy.spring.AccountService$$EnhancerBySpringCGLIB$$f8bd6705

这是Spring官网给出的一个受事务管理的概念视图:

41d4a5db583efc10b66401dac1bdda8e.png

AOP增强了我们的Service类,当真实的方法被调用前与调用后,Spring替我们完成commit/rollback等操作,以实现事务管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 58. 最后一个单词的长度

1. 题目 给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。 如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。 如果不存在最后一个单词,请返回 0 。 说明:一个单词是指仅由字母组…

prompt终于在机器人领域杀疯了

编|杜伟、陈萍源|机器之心谷歌机器人团队等在机器人领域构建了一个多任务 transformer 模型,显著改进了对新任务、环境和对象的零样本泛化。我们知道,机器学习(ML)多个子领域(如 NLP 和 CV&…

python打开excel数据库_使用python导入excel文件中的mssql数据库数据

我试图用python导入excel文件中的mssql数据库数据。我的数据在excel表格中的顺序不正确。e、 g它显示第1列数据,然后是第3列,第2列,然后是第4列,依此类推。我使用以下脚本:import pyodbcimport csvconnection pyodbc.…

雷鸟安装的插件

lightning日历功能 同步lightning和google日历的插件:provider_for_google_calendar 使用可以参考:http://jackbin.blogspot.com/2008/02/lightning-5.html 导入OE邮件时用了ImportExportTools转载于:https://www.cnblogs.com/cerxp/archive/2008/09/28/…

LeetCode 66. 加一

1. 题目 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入: [1,2,3] 输出: [1,2,4] 解…

ChatGPT的前世今生

作者|符尧等整理|李rumor最近有幸看到了一篇十分深度剖析GPT系列模型的文章,读到后赶紧与作者联系,没想到他们很快就翻译成了中文,在这里分享给大家。英文原版:https://franxyao.github.io/blog.html作者:符…

文件管理(一)

文件是同一类型元素的有序集合,是内存与外设间传输数据的渠道。一些外设如显示器、键盘、打印机等都可以看作文件,但最常用的还是磁盘文件,这也是本章我们主要讨论的对象。 Delphi继承了Object Pascal的文件管理功能,并有很大的发…

LeetCode 95. 不同的二叉搜索树 II(递归)

1. 题目 给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树:1 3 3 …

离谱!以AI数据标注为名,偷拍女性上厕所?

源|新智元文|好困 David你绝对想不到,自己在家上厕所的「实时动态」,不仅被拿去给AI做了训练数据,而且还被发到了网上!最近,《麻省理工科技评论》在一篇万字长文调查中,就曝光了这样…

treemap怎么保证有序_干货!208道面试题教你怎么通过面试!

[如您对本文感兴趣,请点击标题下方蓝色“拓达IT训练营”添加关注,每天都有精彩实用文章呈现给您]一、Java 基础1.JDK 和 JRE 有什么区别?2. 和 equals 的区别是什么?3.两个对象的 hashCode()相同,则 equals()也一定为 …

看美女无数

看美女无数——代腾飞 2008年9月30日 于成都漫漫长假,却不知如何渡大千世界,却找不到去处只好独自骑着车儿压马路 来来往往,美女无数虽闭城不出,却也大饱眼福知足,知足 坐看春熙路,看美女购物熙来攘往&am…

LeetCode 107. 二叉树的层次遍历 II(队列)

1. 题目 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回其自底向上的层次遍历为…

什么是document对象?如何获取文档对象上的元素?_dom对象

DOM对象1. DOM树当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model),通过 HTML DOM对象,可访问 JavaScript HTML 文档的所有元素。HTML DOM 模型被构造为对象的树。节点(Node):HTML文档…

用python生成云词汇_用python生成词云wordcloud

代码如下:import wordcloudimport jiebaexcludes{"将军","却说","二人","不可","荆州","不能","如此","商议","如何","主公","军士","左右&q…

JavaScript在内层循环中断外层循环

很少见的用法…… var elem1 [1,2,3,5,6];var elem2 [7,5,0];label1 : { for (var i 0; i < 10; i) { for (var j 0; j < 10; j) { if (elem1[i] elem2[j]) { break label1; } } }} 转载于:https://www.c…

综述论文:机器学习中的模型评价、模型选择与算法选择!

源&#xff5c;机器之心本论文回顾了用于解决模型评估、模型选择和算法选择三项任务的不同技术&#xff0c;并参考理论和实证研究讨论了每一项技术的主要优势和劣势。进而&#xff0c;给出建议以促进机器学习研究与应用方面的最佳实践。论文链接&#xff1a;https://sebastianr…

阿里巴巴后台的使用体验

今天花了点时间&#xff0c;使用了一下阿里巴巴的会员后台&#xff0c;感叹一句“它的成功是有它的道理的”。在功能模块的使用上&#xff0c;它都提供了帮助&#xff0c;这种帮助不是简单的一个列表或者一篇文章&#xff0c;而是一种层次性的服务。首先会有一个所对应的功能模…

LeetCode 167. 两数之和 II - 输入有序数组(双指针)

1. 题目 给定一个已按照升序排列 的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2&#xff0c;其中 index1 必须小于 index2。 说明: 返回的下标值&#xff08;index1 和 index2&#xff09;不是从零开始的。你可…

lcd液晶字体_等离子电视与液晶电视的区别

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供读者参考&…

母版中menu控件上传后出现脚本错误

这几天帮朋友做个小网站&#xff0c;为了网站更容易扩展&#xff0c;所以使用了.menu控件做网站导行&#xff0e;本来在做的时候没出错&#xff0c;可上 传之后却显示不出&#xff0c;动态菜单的部分&#xff0c;并且提示脚本错误&#xff0e;于是乎上网开始找答案&#xff0c;…