尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Spring对事务的支持
一、什么是事务事务是一组数据库操作这些操作要么全部成功要么全部失败并回滚。在一个业务流程中通常需要多条DMLinsert、delete、update语句共同联合才能完成。这些语句必须同时成功或者同时失败。二、事务的四大特性原子性事务是最小不可分割单元全部成功或者全部回滚。一致性事务前后数据状态合法转账总金额不变。隔离性多个事务并发执行互相隔离。持久性事务提交成功数据库永久落库宕机也不丢失。三、事务的四个处理过程开启事务执行核心业务代码提交事务核心业务过程中没有出现异常才能提交事务回滚事务核心业务处理过程中出现异常就回滚事务四、事务并发带来的问题脏读读到别的事务未提交的数据例如不可重复读同一个事务内两次读同一个数据中间被别的事务修改提交两次结果不一样。幻读同一个事务两次查询别的事务新增/删除数据行数变了。例如五、事务的隔离级别解决并发问题六、事务属性Propagation propagation() default Propagation.REQUIRED;--用来设置事务的传播特性Isolation isolation() default Isolation.DEFAULT;--设置事务的隔离级别int timeout() default -1;--设置事务的超时时间boolean readOnly() default false;--设置只读事务Class? extends Throwable[] rollbackFor() default {};--指定哪些异常时回滚Class? extends Throwable[] noRollbackFor() default {};--指定某个异常时不回滚6.1 事务传播行为什么是事务的传播行为在某个类中有两个方法a方法和b方法连个方法上都有事务在a方法中调用b方法事务是如何传递的是合并到一个事务还是开启一个新的事务这就是事务的传播行为。REQUIRED默认有事务就加入当前事务没有新建事务。共用同一个事务一起提交、一起回滚。 绝大多数业务使用SUPPORTS有事务就加入没有事务就非事务运行。适合查询、只读方法。MANDATORY必须在已有事务里执行外面没有事务 → 直接抛异常。强制上层开启事务。REQUIRES_NEW一定新建独立事务外层如果有事务先把外层事务挂起。两个事务完全独立互不影响。、NOT_SUPPORTED以非事务方式执行外层有事务就把外层事务挂起。不参与事务。NEVER必须无事务运行外层存在事务 → 抛出异常。禁止在事务内调用。NESTED 嵌套事务外层有事务开启嵌套子事务基于数据库savepoint保存点 内层子事务回滚只回滚到保存点不影响外层 外层事务回滚嵌套子事务跟着一起回滚。 外层没有事务行为等价于 REQUIRED。在代码中设置事务的传播行为代码如下Transactional(propagation Propagation.REQUIRED)七、Spirng实现事务的两种方式编程式事务这里不讲用的少声明式事务重点基于注解的方式重点基于XML的方式目前不做讲解基于注解的方式测试传播行为代码如下目录结构如下两个类MyService1和MyService2类Service public class MyService1 { Autowired private AccountMapper accountMapper; Autowired private MyService2 myService2; Transactional(propagation Propagation.REQUIRED) public void save(Account account) { accountMapper.insert(account); try { Account act new Account(); act.setActNo(act-004); act.setBalance(new BigDecimal(200)); myService2.save(act); } catch (Exception e) { } } }Service public class MyService2 { Autowired private AccountMapper accountMapper; Transactional(propagation Propagation.REQUIRED) public void save(Account account) { accountMapper.insert(account); //模拟异常 // System.out.println(10/0); } }SpringMybatisConfig代码如下Configuration //组件扫描 ComponentScan(com.cjs.bank) EnableAspectJAutoProxy(proxyTargetClass true) //引入外部属性配置文件 PropertySource(classpath:application.properties) //Mapper扫描器 MapperScan(basePackages {com.cjs.bank.mapper}) //开启事务注解支持 EnableTransactionManagement public class SpringMybatisConfig { //配置数据源 Bean public DataSource dataSource(Value(${mybatis.data.source.driver}) String driverClassName, Value(${mybatis.data.source.url}) String url, Value(${mybatis.data.source.user}) String name, Value(${mybatis.data.source.password}) String password ) { HikariDataSource dataSource new HikariDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setJdbcUrl(url); dataSource.setUsername(name); dataSource.setPassword(password); return dataSource; } //注意方法参数dataSource Spring IoC容器会自动注入 //配置SqlSessinFactioryBean Bean public SqlSessionFactoryBean sqlSessionFactoryBean(Value(${mybatis.config.location}) String configLocatin,DataSource dataSource, Value(${mybatis.type.aliases.package}) String typeAliasesPackage ) { SqlSessionFactoryBean sqlSessionFactoryBean new SqlSessionFactoryBean(); // Resource resource new ClassPathResource(configLocatin); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(configLocatin)); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage); //指定Mapper XML文件位置 try { sqlSessionFactoryBean.setMapperLocations( new PathMatchingResourcePatternResolver().getResources(classpath*:com/cjs/bank/mapper/*.xml)); } catch (java.io.IOException e) { throw new RuntimeException(加载Mapper XML失败, e); } return sqlSessionFactoryBean; //返回IoC容器管理 } //配置事务管理器,还需要开启事务注解这样Transactional才可以使用因此还需要配置一个开关 Bean public DataSourceTransactionManager transactinManage(DataSource dataSource) { DataSourceTransactionManager dataSourceTransactionManager new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager; } }Account代码如下Data public class Account { private Long id; private String actNo; private BigDecimal balance; }AccountMapper代码如下public interface AccountMapper { /** * 根据账号查询账号信息 * param actNo 账号 * return 账号信息 */ Account selectByActNo(String actNo); /** * 根据账号的余额 * param account 账号对象 * return 1表示成功其他值表示失败 */ int updateBelanceByActNo(Account account); /** * 保存账号信息 * param account * return */ int insert(Account account); }AccountMapper.XML关键代码如下?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.cjs.bank.mapper.AccountMapper insert idinsert insert into t_act(act_no,balance) values(#{actNo},#{balance}) /insert /mapper单元测试代码如下Test public void test2(){ ApplicationContext act new AnnotationConfigApplicationContext(SpringMybatisConfig.class); MyService1 myService1 act.getBean(MyService1.class); Account account new Account(); account.setActNo(act-003); account.setBalance(new BigDecimal(200)); myService1.save(account); }数据库图片程序分析以上代码主要是测试事务的传播行为有的代码多余是其他公共不影响此处的操作。数据库图片为结构图。操作步骤修改在MyService1和MyService2中的关键代码Transactional(propagation Propagation.REQUIRED)会有不同的结果。
RELATED

相关推荐

2026年湖北安全员C3证考试题库+答案+解析

2026年湖北安全员C3证考试题库+答案+解析

2026年安全员ABC证考试精准题库⬆️⬆️⬆️ 点击上方卡片立即获取⬆️⬆️⬆️ 考点练习题型练习易错题模拟考错题集收藏夹2026年湖北建筑安全员C3证考试真题题库 题库来源:安教安全员通关宝第1题【单选】已满()周岁不满十八周岁的未成年人有…

📅 2026/11/5 3:56:14
研究生实测|国内学位论文 AI 辅助工具梯度排行榜

研究生实测|国内学位论文 AI 辅助工具梯度排行榜

前言 写论文选 AI 工具,不能只看网上的热度。不同工具的定位差异很大,有的主打文献精读,有的擅长文本校对,很少有工具可以完整适配国内本科、硕士论文从开题、实证写作、格式排版到盲审返修的整套流程。 这份榜单以研究生真实写…

📅 2026/11/5 3:56:14
Rancher 多服务启动失败复盘:从 Docker 未自启、18 万条历史重试,到回滚实例 IP 冲突

Rancher 多服务启动失败复盘:从 Docker 未自启、18 万条历史重试,到回滚实例 IP 冲突

故障复盘日期:2026-11-03 适用范围:Rancher 1.x / Cattle 全文已脱敏 管理页面能够打开,服务器也能通过 SSH 登录,但生产环境的认证、网关、注册中心、缓存和大屏服务却大量停在 Activating、Waiting: container starting 或 R…

📅 2026/11/5 3:56:14
MORE NEWS

更多资讯

📰

【Git】从入门到精通(十一)—— git reset 三种模式详解

一、git reset 的作用 在深入三种模式之前,我们先搞清楚 git reset 到底在做什么。 git reset 的核心作用是:移动 HEAD 指针和当前分支指针,并可选地影响暂存区和工作区。 回顾一下 Git 的三大区域: 工作区(Workin…

📰

MarkItDown 实战指南:一条命令把 PDF、Word、PPT 转成 Markdown,扫描件也能提字

MarkItDown 实战指南:一条命令把 PDF、Word、PPT 转成 Markdown,扫描件也能提字 【免费下载链接】markitdown Python tool for converting files and office documents to Markdown. 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown …

📰

MAS 免费激活脚本:一条命令搞定 Windows 与 Office,离线内网照样能激活

MAS 免费激活脚本:一条命令搞定 Windows 与 Office,离线内网照样能激活 【免费下载链接】Microsoft-Activation-Scripts Open-source Windows and Office activator featuring HWID, Ohook, TSforge, and Online KMS activation methods, along with adv…

📰

AvianVisitors 界面全功能速览:Collage 拼贴、Stats 统计与 Atlas 图鉴的 10 分钟上手教程

【免费下载链接】AvianVisitors A live bird collage from your window. 项目地址: https://gitcode.com/gh_mirrors/avi/AvianVisitors 点击查看 免费下载 AvianVisitors 是一个基于树莓派(Raspberry Pi)的实时鸟类拼贴(Bird Co…

📰

Folia 全屏歌词播放器安装部署实录:桌面 + Web 全平台 3 条路径一次跑通

Folia 全屏歌词播放器安装部署实录:桌面 Web 全平台 3 条路径一次跑通 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 A multi-platform music player for local files, Navidrome, and online streaming…

📰

PySceneDetect终极性能对比分析:为什么它是最佳场景检测工具选择

PySceneDetect终极性能对比分析:为什么它是最佳场景检测工具选择 【免费下载链接】PySceneDetect :movie_camera: Python and OpenCV-based scene cut/transition detection program & library. 项目地址: https://gitcode.com/GitHub_Trending/py/PySceneDet…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬