Spring JDBC声明式事务管理
Java事务的类型有三种:
(1)JDBC事务:可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。
(2)JTA(Java Transaction API)事务:事务可以跨越多个数据库或多个DAO,使用也比较复杂。
(3)容器事务:主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
Spring 实现JDBC声明式事务管理可以使用 Annotation 注解。使用注解实现可以减少代码之间的耦合度。
使用 Annotation 的方式非常简单,只需要在项目中做两件事,具体如下。
1)在 Spring 容器中注册驱动,代码如下所示:
<!-- 注册事务管理驱动 -->
<tx:annotation-driven transaction-manager="transactionManager" />
或者使用注解
@Aspect
@EnableTransactionManagement //等同于xml配置中的 <tx:annotation-driven />
public class TransactionConfig {}
2)在需要使用事务的业务类或者方法中添加注解 @Transactional,并配置 @Transactional 的参数。关于 @Transactional 的参数如图所示。
常用属性说明如下:
- propagation:设置事务的传播行为
- isolation:设置事务的隔离级别
- readOnly:设置是读写事务还是只读事务
- timeout:事务超时事件(单位:s)
示例代码如下:
注:以下代码使用springboot
SQL:
INSERT INTO account (username,salary) VALUES ('Bob',3000);
INSERT INTO account (username,salary) VALUES ('Make',3000);
DAO层,在OrdersDao中注入jdbcTemplate,实现数据库操作:
@Repository
public class OrdersDao {// 注入jdbcTemplate模板对象@Autowiredprivate JdbcTemplate springJdbcTemplate;/*** Make减去1000*/public void reduceMoney() {String sql = "update account set salary=salary-? where username=?";springJdbcTemplate.update(sql, 1000, "Make");}/*** Bob增加1000*/public void addMoney() {String sql = "update account set salary=salary+? where username=?";springJdbcTemplate.update(sql, 1000, "Bob");}
}
Service层,OrdersService接口
public interface OrdersService {//转账操作void accountMoney();
}
具体实现,OrdersServiceImpl
@Service
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,rollbackFor = Exception.class,readOnly = false)
public class OrdersServiceImpl implements OrdersService{@Autowiredprivate OrdersDao ordersDao;// 调用dao的方法,业务逻辑,写转账业务public void accountMoney() {ordersDao.addMoney();// 2-加入出现异常如下面intint i=10/0; //银行中可能为突然停电等...// 3-Make减少1000ordersDao.reduceMoney();}
}
application.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springtemplate?useSSL=false
jdbc.username=root
jdbc.password=root
具体配置类,JdbcConfig
@Configuration
public class JdbcConfig {@Value("${jdbc.driverClass}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;/*数据源*/@Bean("dataSource")public DriverManagerDataSource getDriverManagerDataSource(){DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName(this.driver);dataSource.setUrl(this.url);dataSource.setUsername(this.username);dataSource.setPassword(this.password);return dataSource;}/*jdbc模板*/@Bean("springJdbcTemplate")public JdbcTemplate getJdbcTemplate(DataSource dataSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);//配置数据源return jdbcTemplate;}
}
具体配置类,TransactionConfig
@Aspect
@EnableTransactionManagement //等同于xml配置中的 <tx:annotation-driven />
public class TransactionConfig {/*** 配置事务管理器 注入连接池*/@Bean(name = "transactionManager")public DataSourceTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
编写单元测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class OrdersServiceImplTest {@AutowiredOrdersService ordersService;@Testpublic void accountMoney() {ordersService.accountMoney();}
}
测试结果:
java.lang.ArithmeticException: / by zero
at com.swadian.spring_learn.service.OrdersServiceImpl.accountMoney(OrdersServiceImpl.java:36)
at com.swadian.spring_learn.service.OrdersServiceImpl$$FastClassBySpringCGLIB$$4dccf147.invoke(<generated>)
因为出现了异常,所以事务实现了回滚,扣款和加钱操作均没有成功(防止了一方加钱成功另一方扣钱失败的情况),保持了数据的一致性。
Spring JDBC声明式事务管理相关推荐
- spring配置c3p0连接池、spring的声明式事务管理
一.spring配置c3p0连接池: 1.导入maven依赖: <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> & ...
- Spring框架声明式事务管理
Spring框架声明式事务管理 底层就是AOP原理,面向切面编程 在不修改源码的情况下,对方法进行增强 Spring框架事务管理相关类和API PlatformTransactionManager 平 ...
- Spring系列--声明式事务管理
Spring事务管理概述 Spring的事务管理简化了传统的事务管理流程,并且在一定程序上减少了开发者的工作量. 事务管理的核心接口 在Spring的所有JAR包中包含一个名为Spring-tx-5. ...
- Java程序员从笨鸟到菜鸟之(八十)细谈Spring(九)spring+hibernate声明式事务管理详解
声明式事务管理是spring对事务管理的最常用的方式,因为这种方式对代码的影响最小,因此也符合非侵入性的轻量级容器的概念.Spring的事务管理是通过AOP的方式来实现的,因为事务方面的代码与spri ...
- Spring的声明式事务管理
在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例外(RunTimeExcep ...
- spring aop 声明式事务管理
http://www.cnblogs.com/wangkaipeng/p/5782116.html
- 全面分析 Spring 的编程式事务管理及声明式事务管理(转)
摘要 Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握.本教程从基础知识开始,详细分析了 Spring 事务管理的使用 ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理--转
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- Spring Framework--Data Access(1)--Transaction Management(2) - 声明式事务管理
一.概述 Spring的声明式事务管理是通过Spring的AOP实现的,Spring的事务管理和EJB CMT类似,都可以在方法级别上定义事务行为,不过他们两者也有区别,表现在: (1)EJB CMT ...
最新文章
- c# 如何将字符串中用,分开的数字分别存入数组中
- 手把手带你领略双十一背后的核心技术Sentinel之服务的熔断降级
- matlab宏参赛,MATLAB杯无人机大赛 | 决赛通知!
- LeetCode 860. 柠檬水找零(贪心)
- linux 脚本 语法错误,从windows拷贝到linux的脚本报错:未找到命令 or 语法错误
- Nginx(七):nginx原理解析
- linux修图,修图只知道Photoshop?11款高逼格修图工具快来get!
- Unsupported major.minor version (jdk版本错误)解决方案办法
- mtk协议与qc协议_通用充电器快充协议QC2.0,QC3.0,MTK PE,PE+,充电识别
- 74cms搭建 2021.03.13
- 神奇魔方html5游戏在线玩,神奇的魔方
- mysql 重做日志_mysql redo log 重做日志
- Linux7.5 安装mysql8.0.13教程
- 【阿里出品】数智园区白皮书(附下载)
- 一体的综合化云控平台
- css布局——GFC
- 日常工作中遇到的那些坑
- 校企合作案例【新文科背景下“三驾马车”与电子商务实验教学的深度融合】
- 快速幂算法c语言求a的n次方,快速幂算法(数学)
- MySQL一行变多行,多行变一行
热门文章
- Php socket 考勤机,php-socket
- 第3章 感受(一)——3.1. Hello world 经典版
- net12. 客户类——TcpClient
- java毕业设计普通中学体育卫生信息管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
- python简单方便获取BDUSS
- 前端开发:JavaScript合并数组的方法
- Excel - IF 及IFERROR 判断逻辑
- kali linux手机运行,使用Kali Linux入侵Android手机
- (一)C#调用一言API并提取关键字
- python 模块保存在哪_python模块存储在哪里?