前言:
Spring对于各种各样的ORM框架(包括JDBC) 都可以它进行声明式事务管理,以下讲
解的是Spring对Hibernate的声明式事务管理,也是用的最多的;
一.导入命名空间并注入SessionFactory
在spring配置文件中beans元素中:
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation=”
http://www.springframework.org/schema/tx
2.注入SessionFactory;
二.配置Hibernate事务管理器
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
注意:
(1)使用HibernateTransactionManager类管理事务, 其实这个类就相当于一个
aspect(切面类),运用了AOP原理;
(2)这是作为公共使用的事务管理器Bean。这个会事先配置好,不需要各个模块各
自去配(也就是有多个spring配置文件时);
(3)HibernateTransactionManager这个类怎么管理事务呢?这里就使用了
SessionFactory,从SessionFactory中获取连接,所以这里需要需要注入一个
SessionFactory;
三. 增加Annotation驱动的Transaction管理:
<tx:annotation-driven transaction-manager=“transactionManager”/>
注意:transaction-manager属性需要指定一个TransactionManager(也就是事务管理器), 对于Hibernate的事务管理你需要指定Hibernate事务管理器;
四.关于@Transactional注解的使用:
前言:
(1)如果你需要在一个方法中增加事务,这时你就可以在这个方法上添加@Transactional
注解,它会自动在方法执行前与方法执行后添加关于事务的业务逻辑(也就是
@Transactional使用了AOP编程模式);
(2)在Spring默认情况下,如果捕捉到的或则抛出的是一个RuntimeException 会自 动回滚事务;
(3)其实Hibernate在运行期间抛出的异常均为RuntimeException
好处:
在Spring中对Hibernate进行事务管理,可以把我们的重点放在业务逻辑上,而 不必在关注try…catch…finally (发生异常时对事务的操作);
1.@Transactional注解的配置:
属性:
1)propagation:
在Spring为事务的传播性(也就是事务的产生过程), 默认值为
Propagation.REQUIRED;
类型:枚举类型Propagation;
Propagation枚举类型中共有5个取值:
2.事务的传播行为
1).requierd
如果有事务那么加入事务,没有的话新建一个
2).not_supported
不开启事务
3).requires_new
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完,继续执行老事务
4).mandatory
必须在一个已有的事务中执行,否则抛出异常
5).never
必须在一个没有的事务中执行,否则抛出异常
6).supports
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务那就不用事务
3.readOnly:布尔类型
如果取值为true,就是只读型事务,也就是在该事务中没有insert、update、delete
操作;
如果取值为false,就是读写型事务,也就是在该事务中就能读又能写;
注意:该属性是做优化使用的;也防止我们在只读事务中,写了更改操作;