欢迎使用CSDN-markdown编辑器
来源:互联网 发布:autoit python 编辑:程序博客网 时间:2024/06/18 16:35
目标
1、事务回顾 :基本概念
2、Spring事务管理的一组API :通过api管理spring事务
3、Spring的编程式事务管理
4、Spring的声明式事务管理
1、事务回顾:
· 什么是事务?
事务指的是逻辑上的一组操作,这组操作要么全部成功,要不全部失败
·事务的特性: 原子性:原子性是指事务是一个不可分割的工作单位,事物中的操作要么都发生,要么都不发生 一致性:一致性指事务前后数据的完整性必须保持一致 隔离性:隔离性指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要互相隔离 (可设置隔离级别) 持久性:持久性是指一个事物一旦被提交,他对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响
· Spring 事务管理高层抽象主要包括3个接口
· Platform TransactionManager 事务管理器
管理事务— 提交、回滚Spring为不同的持久化框架提供了不同PlatformTransactoinManager接口实现
· TransactionDefinition 事务定义信息(隔离、传播、超时、只读)
事务定义信息—隔离级别、传播行为、是否超时、是否只读
如果不考虑隔离性,会引发安全问题如下:
脏读: 一个事务读取了领一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。 不可重复读: 在同一事务中,多次读取同一数据返回的结果有所不同 幻读: 一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。 再后来的查询中,第一个事务就会发现有些原来没有的记录
传播行为:
· TransactionStatus 事务具体运行状态
运行状态—是不是提交、有没有保存点、是不是新事务
Spring 支持两种方法的事务管理 -编程式的事务管理 · 在实际应用中很少使用 · 通过TransactionTemplate手动管理事务 · 在AccountService中使用TransactionTemplate · TransactionTemplate依赖DataSourceTransactionManager · DataSourceTransactionManager依赖DataSource构造//注入转账的Dao的类 private AccountDao accountDao; //注入事务管理的模板 private TransactionTemplate transactionTemplate; /*** * Java * @param out 转出账号 * @param in 转入账号 * @param money 转出金额 */ @Override public void transfer(final String out, final String in, final Double money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { accountDao.outMoney(out, money); //int i=1/0; accountDao.inMoney(in, money); } }); }
Spring 支持两种方法的事务管理 -编程式的事务管理 · 在实际应用中很少使用 · 通过TransactionTemplate手动管理事务 · 在AccountService中使用TransactionTemplate · TransactionTemplate依赖DataSourceTransactionManager · DataSourceTransactionManager依赖DataSource构造
<!-- applicationContext.xml --><!-- 引入外部属性文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置c3p0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 配置业务层类 --> <bean id="accountService" class="cn.muke.spring.demo1.AccountServiceImpl"> <property name="accountDao" ref="accountDao" /> <!-- 注入事务的模板 --> <property name="transactionTemplate" ref="transactionTemplate" /> </bean> <!-- 配置Dao层类 --> <bean id="accountDao" class="cn.muke.spring.demo1.AccountDaoImpl"> <!-- 注入连接池 --> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务管理器 -编程式事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入连接池 --> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置事务管理模板:Spring为了简化事务管理的代码所提供的类 --> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <!-- 注入事务管理器 --> <property name="transactionManager" ref="transactionManager" /> </bean>
-使用XML配置声明式事务 · 开发中推荐使用(代码侵入性最小) · Spring的声明式事务是通过AOP实现
/*** * 测试 * 转账案例测试类 * @author smallearly * */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringDemo1 { @Resource(name="accountService") private AccountService accountService; @Test public void demo1(){ accountService.transfer("aaa", "bbb", 200d); }}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd"> <!-- 引入外部属性文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置c3p0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 配置业务层类 --> <bean id="accountService" class="cn.muke.spring.demo2.AccountServiceImpl"> <property name="accountDao" ref="accountDao" /> </bean> <!-- 配置Dao层类 --> <bean id="accountDao" class="cn.muke.spring.demo2.AccountDaoImpl"> <!-- 注入连接池 --> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入连接池 --> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置业务层代理 --> <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 配置目标对象 --> <property name="target" ref="accountService" /> <!-- 注入事务管理器 --> <property name="transactionManager" ref="transactionManager" /> <!-- 注入事务属性 --> <property name="transactionAttributes"> <props> <!-- prop的格式 * PROPAGATION :事务的传播行为 * ISOLATION :事务的隔离级别 * readOnly :只读(不能 修改、插入、删除) * -Exception :发生什么异常回滚事务 * +Exception :发生什么异常不回滚事务 --> <prop key="transfer">PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop> </props> </property> </bean></beans>
阅读全文
0 0
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- JQuery实现的输入框自动补全
- TCP四次握手断开连接
- 效率第一!
- redis主从集群搭建及容灾部署(哨兵sentinel)
- Java中获取文件大小的正确方法
- 欢迎使用CSDN-markdown编辑器
- 质料收集
- Python练手程序-06
- 微信小程序仿手机淘宝新增地址自动识别地址,姓名,手机号
- POJ 3693 Maximum repetition substring 后缀数组求重复次数最多子串
- Makefile中的info函数
- Google的大规模集群管理系统Borg
- 【趣发现】区块链和云计算类型撞名了?
- 智链ChainNova携手IBM推出端到端区块链联合解决方案