版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Spring 事务管理- Java -课堂- 话题- 迟宏泽- CSDN学生大本营 .Spring 事务管理热 1 迟宏泽 2010-07-27 23:56Spring 事务管理Spring 不会直接去管理事务, 它提供了很多可供选择的事务管理器 ,将事务委托给 JTA 或某些特定的平台事务实现。常见的 Spring 事务管理器 :org.springframework.jdbc.datasource.DataSourceTransactionManager提供 JDBC 事务支持 ,也可以用来支持iBatisorg.springframework.orm.hibernate.Hibernat
2、eTransactionManager Hibernate2持久事务支持org.springframework.orm.hibernate.HibernateTransactionManager Hibernate3持久事务支持org.springframework.orm.jpa.JpaTransactionManagerJPA 持久事务支持这些都是一些持久性事务,也是平时用的最多的(尤其是对我这种天天CRUD 的人) OK! 知道了这一点我们便可以在Spring 中编写事务 ,最常用的方法是使用TransactionTemplate,如果你用过Spring 的 JdbcTemplate的话
3、就会觉的它跟这个用法很像。首先我们需要声明一个Spring 的事务管理器。 我们知道, 使用 JdbcTemplate 需要一个数据源,使用事务那么也需要一个声明一个事务管理器 :<bean id=transactionManager class=org.springframework.jdbc.datasoure.DataSoureTra nsactionManager><property name=dataSource ref=dataSource/> </bean> 这是 JDBC 的事务管理器,它有一个dataSource属性,指向要操作的数据源.接
4、下来我们要写一个用户注册的服务(我实在举不出什么好例子来了):publicclass UserService Autowiredprivate TransactionTemplate transactionTemplate;Autowiredprivate UserDAO userDAO;Autowiredprivate MailSender sender;public UserService()public void reg(final User user)transactionTemplate.execute(newTransactionCallback()public ObjectdoI
5、nTransaction(TransactionStatus ts)tryuserDAO.insert(user);sender.send();catch(Exception e)ts.setRollbackOnly();return null;);注册服务分为两个步骤,一个是将用户的信息插入到数据库,二是向用户发送邮件激活通知。这两个步骤是原子性的(好吧),因此需要使用事务支持,事务操作主要是通过TransactionTemplate来实现的 ,我们需要在 Spring 配置文件中配置它:<bean id=transactionTemplateclass=org.springframe
6、work.transaction.support.TransactionTemplate><property name=transactionManagerref=transactionManager/></bean>属性 transactionManager 指向前面声明的 JDBC 事务管理器我们只需要将事务代码放入到 doInTransaction 方法中即可,如果 doIntransaction 能够被成功执行到 return ,则事务将被提交,如果中途遇到问题,如 Exception, 则调用 setRollbackOnly() 方法回滚整个事务 Spr
7、ing 对声明式事务的支持:嗯 上面这段代码不是很好, 为啥?因为 reg 服务应该只去管用户注册这个事情,但是它现在却包含了很多事务处理的代码,违反了单一原则,这时候你可能会想到AOP,能不能使用AOP来处理事务呢?嗯,开发Spring的大牛们当然会去想到这一点,他们为此提供了声明式事务的支持,这个支持也是通过Spring 的 AOP 框架来实现的。什么是声明式事务?就是通过配置文件和注解等方式来进行事务的声明,而不去侵犯程序代码, 这样就不会违背单一职责原则了。Spring中的声明式事务是使用参数来定义的,一个参数就是对事务策略应该如何应用到某个方法的一段描述,这些参数名字很长,比我的发型
8、还恶心。传播行为:传播行为定义了关于客户端和被调用方法的事务边界1. PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务, 支持当前事务。如果没有事务,则非事务的执行3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。 如果没有一个活动的事务, 则抛出异常。4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。5. PROPAGATION_NOT_SUPPORTED: 总是非事务
9、地执行,并挂起任何存在的事务。6. PROPAGATION_NEVER: 总是非事务地执行, 如果存在一个活动事务,则抛出异常7. PROPAGATION_NESTED :如果一个活动的事务存在,则运行在一个嵌套的事务中 . 如果没有活动事务 ,则按 TransactionDefinition.PROPAGATION_REQUIRED属性执行隔离级别:隔离级别定义了事务受并发活动的影响程度1. ISOLATION_DEFAULT : 这是一个 PlatfromTransactionManager 默认的隔离级别, 使用数据库默认的事务隔离级别 .另外四个与JDBC 的隔离级别相对应2. ISO
10、LATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。3. ISOLATION_READ_COMMITTED : 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读 )。5. ISOLATION_SERIALIZABLE这是花费最高代价
11、但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读关于脏读 (Dirty read) 、不可重复读 (Nonrepeatable read)和幻读(Phantom reads)的介绍:脏读:如果事务A 读取了事务B 改写但是尚未提交的数据,事务 B 发生了问题 (来了大姨妈?)回滚了, 那么 A 所读取的数据是无效的,这个故事叫做脏读不可重复读:如果一个事务多次读取数据,每一次结果都不同,这是由于另一个事务在更改数据,这个故事叫做不可重复读幻读:幻读跟不可重复读差不多,如果一个事务A 读取了数据,事务 B 又插入了一些数据,在后来的查询中事务A 发现了一
12、些额外的记录很简单?哈哈.看看在 Spring 中如何使用声明式事务 :Spring2.0开始为事务提供了配置元素首先需要在Spring 配置文件中添加AOP 支持,因为 Spring声明式事务是基于AOP 的,然后在加入事务标签支持:命名空间:xmlns:tx=/schema/txSchema 声明:/schema/tx/schema/tx/spring-tx-2.0.xsd 接下来我们只需要添加如下配置内容就可以使用声
13、明式事务了:<!-这个就不详细说了,添加AOP 支持-><aop:config><aop:pointcutexpression=execution(*. .UserServicce.reg(.)/><aop:advisoradvice-ref=txAdvice/></aop:config><!-重点是下面-><tx:advice id=txAdvicetransaction-manager=transactionManager><tx:attributes><tx:method name=re
14、gpropagation=REQUIRED/></tx:attributes></tx:advice><tx:advice>用来声明事务策略,同样需要指定一个事务管理器,这个是必须的,我们知道Spring不会自己去管理事务的,它一向喜欢代理,让人看起来好像一切都是它的功劳, 嗯!<tx:attribute>声明了事务参数,<tx:method>是需要提供事务支持的方法,需要注意的是它有这么几个参数:isolation: 指定事务隔离级别no-rollback-for:对于哪些异常不回滚(设计者咋就想的这么周到呢!?)propagation: 事务的传播级别read-only: 该事务只读rollback-for: 哪些异常发生之后回滚timeout: 定义事务超时唉 配置文件还是太恶心了,要是有注解 嗯,还真有:首先要添加一个注解驱动标签:<tx:annotation-driventransaction-manager=txManager
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年丽江市国企招聘考试基础题库
- 吉林省-《生物化学》电子教案-细胞信号转导(人卫版)
- 寒假安全教育一封信
- 二零二五年度高速公路服务区临时车位租赁协议3篇
- 广告制作常用材料教学文案
- 老年公寓入住长者健康状况评估表-养老院入住老年人健康状况评估表-健康评估表格
- 2024年阜阳市人民医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 2024年河北工业职业技术学院高职单招语文历年参考题库含答案解析
- 2024年长汀县城关医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 2024年江西工业贸易职业技术学院高职单招职业适应性测试历年参考题库含答案解析
- 2024-2025学年八年级历史上册期末复习课件
- 2025年云南省大理州事业单位招聘339人历年高频重点提升(共500题)附带答案详解
- 2024-2025学年度第一学期三年级数学寒假作业 有答案
- 大型起重机械现场管理手册
- 2024年贵州省公务员录用考试《行测》真题及答案解析
- 江苏省南京市联合体2024-2025学年九年级上学期期中学情分析化学试卷(无答案)
- 二位数乘二位数600道
- 病例讨论-病毒性肝炎
- 动环监控系统介绍文档
- 兽药经营管理制度
- 第一单元 史前时期 原始社会与中华文明的起源 单元检测试题 2024-2025学年统编版七年级历史上册
评论
0/150
提交评论