事务管理
1.事务 (见hibernate的ACID): Spring和EJB一样,不仅提供对程序控制事务管理的支持(手动事务),也对提供声明式事务管理的支持(容器管理事务),但是Spring对程序控制事务管理的支持与EJB很不一样。EJB的事务管理和Java Transaction API(JPA)密不可分。和Ejb不同的是Spring采用的是一种回调机制,把真实的事务从事务代码中抽象出来,那么Spring就不需要JPA的实现。选择手动事务还是容器管理,就是在细微控制和简便操作之间做出选择。想精确控制事务就可以选择手动事务,不用那么精确就可以容器管理事务。
2.事务管理器:不管你是在bean中代码编写事务还是用切面(aspect aop)那样声明事务,都需要Spring的事务管理器连接特定平台的事务实现,每一种访问形式都有一个事务管理器。比如:
jdbc.datasource.DataSourceTransactionManager:jdbc连接的事务管理,iBATIS也支持
orm.hibernate3. HibernateTransactionManager :hibernate3的事务支持
orm.jpa.JpaTransactionManager :jpa的事务支持
orm.jdo.JdoTransactionManager :Jdo事务管理支持
这些事务管理器分别充当了某个特定的事务实现门面,这样你就只要和Spring的事务打交道,而不用关心实际上的事务是怎么实现的(门面模式)
各种事务管理器的配置,以Hibernate 3为例:
3.JDBC事务管理
4,在spring中手动编写事务
利用事务模板TransactionTemplate来手动添加事务
public void addRant(Rant rant) {
transactionTemplate.execute(-àtransactionTemplate是注入transactionManager得到的
new TransactionCallback() {-à TransactionCallback()只有一个方法实现doInTransaction,用一个匿名内部类实现
public Object doInTransaction(TransactionStatus ts) { ------à在事务内执行
try {
rantDao.saveRant(rant);
} catch (Exception e) {
ts.setRollbackOnly();------------------à出现异常就回滚
}return null;
}
}
配置文件
class="com.roadrantz.service.RantServiceImpl"> … ref="transactionManager" />
5,声明式事务
可以把事务想成一个切面,那么就可以用事务性边界包裹Biz层的方法,然后注入事务
Spring提供了三种在配置文件声明事务性边界的方式:★常用的Spring aop代理 bean来支持事务。★但在Spring 2中增加了两种新的方式:简单的XML声明(xml-declared)事务和★注释驱动事务
1)代理事务:声明式事务管理通过使用Spring的TransactionProxyFactoryBean代理POJO来完成。TransactionProxyFactoryBean是ProxyFactoryBean的一个特化,他知道如何通过事务性边界包裹一个POJO的方法来代理他们。
6.事务传播行为:
PROPAGATION_REQUIRED :当前方法必须有一个事务,有事务则运行该事务,没有则开始新的事务。---à最常用
PROPAGATION_MANDATORY:该方法必须有事务,没有事务则抛出异常
PROPAGATION_NESTED :该方法运行在嵌套事务中。如果封装事务不存在则就像第一种PROPAGATION_REQUIRED
PROPAGATION_NEVER :该方法不能有事务,有事务则抛出异常。
PROPAGATION_NOT_SUPPORTED:该方法不能有事务,如果有事务,则将该方法在运行期间挂起。
PROPAGATION_REQUIRES_NEW:方法必须运行在事务里,
PROPAGATION_SUPPORTS:表示当前方法不需要事务性上下文,但是如果有一个事务已经在运行的话,他可以在这个事务里运行。
PROPAGATION, ISOLATION, readOnly, -Exception, +Exception
(传播行为) (隔离级别 可选) (事务只读 可选) (回滚规则 可选)
可以创建事务模板简化配置 :建立事务的抽象声明
abstract=“true”>
2)在Spring2.0声明事务
在Spring2.0中专门为声明事务提供了一些新的标签 tx名称空间下
xmlns:tx=http://www.springframework.org/schema/tx
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
3)定义注释驱动的事务,@Transactional可以在源代码中注释来进一步简化配置
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
@Service("roster")
public class RosterImpl implements Rosterpublic
@Transactional --------------- --------à方法层面的事务
Public Player createPlayer(Player p) {
playerDao.save(p);
return p;
}
base-package="com.kettas.spring.dao.day5.roster.dao,com.kettas.spring.dao.day5.roster.biz">