现在的位置: 首页 > 综合 > 正文

spring学习笔记:spring事务管理

2013年10月15日 ⁄ 综合 ⁄ 共 7772字 ⁄ 字号 评论关闭

关于事物隔离级别, 脏读, 不可重复读, 幻读的理解, 另有一篇文章比较生动的介绍:http://blog.csdn.net/sunxing007/article/details/6427290

spring事务管理相关的接口:
TransactionDefinition:代表一个事物,描述了事务的隔离级别, 超时时间,事务是否只读, 传播规则等等;
TransactionStatus:描述事物的状态;
PlatformTransactionManager:事务管理器接口, 只定义了3个方法:getTransaction()获取事务的状态; commit();rollback(); PlatformTransactionManager是一个接口, 它的实现类需要根据具体的情况来选择, 比如如果用jdbc,则可以选择DataSourceTransactionManager, 如果用Hibernate, 可以选择HibernateTransactionManager;
事务管理器的实现类有多种,根据具体的持久层框架的不同而不同;
spring中的事务传播行为的种类:
PROPAGATION_REQUIRED: 如果当前没有事务,就创建一个事务;如果已经存在事务,则加入事务;
PROPAGATION_SUPPORTS: 如果已经存在事务,则加入事务;如果没有事务,则以非事务的方式执行;
PROPAGATION_MANDATORY: 使用当前事务, 如果没有, 则抛出异常;
PROPAGATION_REQUIRED_NEW: 动一个新的, 不依赖于环境的 "内部(如果是的话)"事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行
PROPAGATION_NOT_SUPPORTED:以非事务的方式执行, 如果当前有事务, 则挂起;
PROPAGATION_NEVER:以非事务的方式执行, 如果当前有事务,则抛出异常;
PROPAGATION_NESTED: 如果当前线程中没有事务, 则按照PROPAGATION_REQUIRED来执行; 如果当前线程中存在事务, 则开始一个 "嵌套的" 事务,  它是已经存在事务的一个真正的子事务.嵌套事务开始执行时,  它将取得一个 savepoint. 如果这个嵌套事务失败, 嵌套事务将回滚到此 savepoint. 
外部事务可通过配置或捕获内部事务抛出的Exception来决定是回滚还是继续往下执行. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交
, 外部事务回滚则内部事务也会回滚, 不管内部事务有没有提交.

关于PROPAGATION_NESTED和PROPAGATION_REQUIRED_NEW, 有一篇好文章, 我转载过来,防止原文被删除:http://blog.csdn.net/sunxing007/article/details/7743704

使用spring声明式的事务管理:
大多数情况下,事务会放在services层,spring声明式的事务管理中,需要做以下的工作:
1 把dao,service注入到spring容器(这些dao, service不涉及事务);
2 需要注入一个transactionManager(它需要dataSource);
3 通过TransactionProxyFactoryBean为目标对象(需要事务的dao, service等等)提供事务增强,产生增强后的代理对象.
看代码:
先添加一个CompanyService,

它调用dao组件执行crud.事务控制一般都放在这一层.

spring事务管理第一种配置方式:为每个目标bean配置一个代理

测试:

你会发现,这里的配置和前面讲的spring aop多么的相同,不错,他们的原理都是一样的,如果你没有了解过spring aop, 建议看一下。

通常情况下,service层需要的事务控制的配置大都相同,而且方法名大都是insertXXX, updateXXX, deleteXXX, searchXXX, checkXXX诸如此类,所以我们可以配置一个可复用的事务代理:

spring事务管理第二种配置方式:目标bean共享代理基类

虽然我们为需要事务增强的bean配置了代理类,但是难保用户还会直接使用目标对象companyServiceTarget; 可以使用拦截器.

spring事务管理第三种配置方式:使用拦截器

测试:此时可以直接使用companyServiceTarget.

spring事务管理第四种配置方式:使用tx命名空间

使用tx命名空间还能对业务方法做更加细致的事务配置, 下面的表格摘自spring docs, 是一些可配置的参数列表和默认值:

Attribute Required? Default Description
name Yes  

Method name(s) with which the transaction attributes are to be associated. The wildcard (*) character can be used to associate the same transaction attribute settings with a number of methods; for example,get*,handle*,
on*Event
, and so forth.

propagation No REQUIRED Transaction propagation behavior.
isolation No DEFAULT Transaction isolation level.
timeout No -1 Transaction timeout value (in seconds).
read-only No false Is this transaction read-only?
rollback-for No  

Exception(s) that trigger rollback; comma-delimited. For example,com.foo.MyBusinessException,ServletException.

no-rollback-for
No  

Exception(s) that do not trigger rollback; comma-delimited. For example,com.foo.MyBusinessException,ServletException

但是这种配置就需要把tx, aop的命名空间加入进来了:臭长臭长的。

spring事务管理第五种配置方式:注解

略...

 

 

抱歉!评论已关闭.