[Spring事务]
来源:互联网 发布:diy相册制作软件 编辑:程序博客网 时间:2024/06/06 01:14
1.四个特性:
1.原子性(Atomicity):确保动作要么全部完成,要么完全不起作用
2.一致性(consistency):一旦事务完成,系统必须确保它所建模的业务处于一致的状态,而不会是部分完成,部分失败。
3.隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
4.持久性(Durability):一旦事务完成,无论发生什么系统错误,结果都不应该受到影响。事务的结果被写到持久化存储器中
2.核心接口
2.1Spring不直接管理事务,提供多种事务管理器,将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。
Spring事务管理器的接口 org.springframework.transaction.PlatformTransactionManager,
---getTransaction
---commit
---rollback
2.1.1 JDBC事务
如果直接用JDBC来进行持久化,DataSourceTransactionManager会为你处理事务边界。通过配置XML适用。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>DataSourceTransactionManager是通过调用java.sql.Connection来管理事务,后者是通过DataSource获取到的。通过调用连接的commit()方法
来提交事务,同样,通过调用rollback()方法进行回滚
2.1.2Hibernate事务
用到HibernateTransactionManager
XML配置如下:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>sessionFactory属性需要装配一个Hibernate的session工厂,HibernateTransactionManager的实现细节是它将事务管理的职责委托给org.hibernate.Transaction对象,hibernate的transaction对象是从hibernate session 中获取到的,当事务成功完成时,hibernateTransactionManager将会调用Transaction对象的commit()方法,反之会调用rollback() 方法
2.1.3Java持久化API事务(JPA)
需要适用spring的JpaTransactionManager来处理事务
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
JpaTM 只需哦装配一个JPA实体管理工厂,JpaTM将与由工厂产生的JPA EntityManager合作来构建事务。
2.1.4 Java原生API事务
如果使用多个数据源或者不用上面的,需要用JtaTransactionManager
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:/TransactionManager" /> </bean>JTA TM 将事务管理的责任委托给javax.transaction.userTransaction,和TransactionManager对象,事务完成通过UserTransaction.commit()方法提交,失败通过UserTransaction.rollback()回滚
2.2基本事务属性的定义,PlatformTransactionManager通过getTransaction(TransactionDefinition definition)方法来得到事务,这个方法里面的参数是TransactionDefinition类,这个类就定义了一些基本的事务属性。
事务属性:传播行为、格力规则、回滚规则、事务超时、是否只读
2.2.1 传播行为
七种传播行为:
propagation_required:当前方法必须运行在事务中,如果当前事务存在,则在事务中运行,不存在启动新事务
propagation_supports:当前方法不需要事务上下文,如果存在当前事务,会在事务中运行
propagation_mandatory:必须在事务运行,如果当前事务不存在会抛出异常
propagation_required_new:当前方法必须运行在它自己的事务中,一个新事务将被启动。如果存在当前事务,在该方法执行期间,当前事务
会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager(需要使用JtaTransactionManager作为事务管理器)
propagation_propagation_not_supported:表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
propagation_never 表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常
propagation_nested 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。
在该方法之前需要调用setSavepoint方法,保存当前状态到savepoint,内层事务依赖于外层事务,外层事务失败时,会回滚内层所做动作,内层事务操作失败不会引起外层回滚。
----TransactionManager tm = null; tm = getTransactionManager();tm.begin(); Transaction ts1 = tm.getTransaction();
--- propagation_nested和propagation_requires_new 区别:如果不存在一个活动的事务都会开启新事务,但是 new内外层事务是两个独立事务,不会互相影响。
另一方面, PROPAGATION_NESTED 开始一个 “嵌套的” 事务, 它是已经存在事务的一个真正的子事务. 潜套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交。
2.2.2隔离级别
1.并发事务引起的问题:
1)脏读 Dirty reads:A事务度去了B事务改写但尚未提交的数据,如果改写回滚,则A事务读取无效数据
2)不可重复读 Nonrepeatable read :发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据,这通常是因为另一个并发事务
在两次查询期间进行了更新。
3)幻读(Phantom read): T1读取几行数据,接着T2插入一些数据,随后查询T1发现原本不存在的记录
不可重复读和幻读差别在与:不可重复读主要是数据修改,幻读在于记录增加或者删除。
2.隔离级别:
isolation_default 使用后端数据库默认的隔离级别
isolation_read_uncommitted 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
isolation_read_committed 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
isolation_repeateable_read 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
isolation_serializable 最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的
2.2.3 只读
事务的第三个特性是它是否为只读事务。如果事务只对后端的数据库进行该操作,数据库可以利用事务的只读特性进行一些特定的优化
2.2.4 事务超时
对数据库的锁定,长时间的事务会不必要的占用数据库资源,事务超时就是事务的一个定时器,如果特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是
等待其结束
2.2.5 回滚规则
可以定义哪些异常会回滚哪些不会。默认 运行期异常才会回滚,检查型异常不会回滚。
2.3事务状态
调用PlatformTransactionManager接口的getTransaction()方法得到的是TransactionStatus接口的一个实现,该接口内容为
public interface TransactionStatus{ boolean isNewTransaction(); // 是否是新的事物 boolean hasSavepoint(); // 是否有恢复点 void setRollbackOnly(); // 设置为只回滚 boolean isRollbackOnly(); // 是否为只回滚 boolean isCompleted; // 是否已完成}
3.编程式事务:
3.1编程式事务和声明式事务的区别:编程式事务侵入到业务代码,提供更详细的事务管理,声明式事务由于基于AOP,既能起到事务管理的作用,
又可以不影响业务代码的具体实现。
3.2如何实现编程式事务:使用TransactionTemplate和直接使用PlateformTransactionManager
3.2.1 使用TransactionTemplate(线程安全)
TransactionTemplate tt = new TransactionTemplate(); // 新建一个TransactionTemplate Object result = tt.execute( new TransactionCallback(){ public Object doTransaction(TransactionStatus status){ updateOperation(); return resultOfUpdateOperation(); } }); // 执行execute方法进行事务管理
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); //定义一个某个框架平台的TransactionManager,如JDBC、Hibernate dataSourceTransactionManager.setDataSource(this.getJdbcTemplate().getDataSource()); // 设置数据源 DefaultTransactionDefinition transDef = new DefaultTransactionDefinition(); // 定义事务属性 transDef.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED); // 设置传播行为属性 TransactionStatus status = dataSourceTransactionManager.getTransaction(transDef); // 获得事务状态 try { // 数据库操作 dataSourceTransactionManager.commit(status);// 提交 } catch (Exception e) { dataSourceTransactionManager.rollback(status);// 回滚 }
4.1配置方式 五种
1)每个bean有一个代理
2)所有bean共享一个代理基类
3)使用拦截器
4)使用tx标签配置的拦截器
5)全注解
@Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.READ_COMMITTED, noRollbackFor={UserAccountException.class}, readOnly=true, timeout=3)
阅读该文章的笔记
http://www.mamicode.com/info-detail-1248286.html
- 事务:spring事务支持
- 事务:spring事务支持
- spring 事务,事务特性
- Spring事务
- Spring 事务
- Spring事务
- spring事务
- Spring事务
- spring 事务
- spring 事务
- spring事务
- Spring 事务
- spring事务
- Spring 事务
- spring 事务
- Spring事务
- Spring 事务
- spring事务
- 如何使用 Spring MVC 进行单文件与多文件上传的三种情况
- LICEcap GIF屏幕录制工具
- IntelliJ Idea 免费激活方法
- 可持久化字典树
- html里嵌套php
- [Spring事务]
- android webview 加载https --忽略证书
- Chrome 及驱动各版本下载地址
- 自顶向下语法分析方法:消除左递归
- 朴素贝叶斯实现垃圾信息分类
- 前端字符串拼接 优化栈内存
- 第五周项目-建立链栈算法库
- 删除vim打开文件末尾的^M
- jQuery AJAX