Spring声明式的事务管理:依beanNameAutoProxyCreator为例
思路:
1、 操作数据库时,为了保证数据库数据的完整性,必须对数据库的操作进行管理,这时就要提到事务:

1)事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

(2):事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。
ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态

(3):事务运行的三种模式:
A:自动提交事务
每条单独的语句都是一个事务。每个语句后都隐含一个COMMIT。
B:显式事务
以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。
C:隐性事务
在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束。
(4):事务的特性(ACID特性)
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
注: 事务是恢复和并发控制的基本单位。

对数据库操作的管理就是对事物的管理,因此在spring的配置文件我们必须对事务进行配置。同时我们也要知道哪些java类需要进行事务的管理。也就是我们必须把要管理的java类与事务的管理类(java类)联系起来。
第一步:创建事务管理器(要管理事务的类)

<bean 

id=”transactionManager” class=”org.springframework..orm.hibernate3.HibernateTransactionManager”> 

<property name=”sessionFactory”><ref local=”sessionFactory”/></property> 

</bean>


在这段配置中为什么要配置sessionFactory呢?
在hibernate中持久化的基本接口是Session。Session使有sessionFactory工厂创建的。Spring通过依赖注入将sessionFactory注入到事务管理器中,而且sessionFactory中必定配置有数据源,就是数据库,这时就把事务和数据库关联上了,其实这个关联只是一种说法,助于理解而已。

第二步:
事务管理器的Bean已经创建好了,我们如何来调用这个事务管理器呢?
创建事务拦截器;

<bean id=”transactionIntercepor” class=”……….”> 

<property name=” transactionManager” ref=” transactionManager”/>


通过依赖注入将transactionManager注入到事务拦截器中,并配置事务的传播属性
事务的传播性:
如果你在你的Service层的这个方法中,除了调用了Dao层的方法之外,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用的这个方法与我本身的方法处在同一个事务中,否则如果保证事物的一致性。事务的传播特性就是解决这个问题的,“事务是会传播的”在Spring中有针对传播特性的多种配置我们大多数情况下只用其中的一种:PROPGATION_REQUIRED:这个配置项的意思是说当我调用service层的方法的时候开启一个事务(具体调用那一层的方法开始创建事务,要看你的aop的配置),那么在调用这个service层里面的其他的方法的时候,如果当前方法产生了事务就用当前方法产生的事务,否则就创建一个新的事务。这个工作使由Spring来帮助我们完成的。

在spring的配置文件中配置了一个操作数据库的bean.例如:

<bean id=”xsDao” class=”org.dao.impl.XsDaoImpl”> 

 ……………………………………… 

</bean>


我们如何在把要管理的数据操作的bean与事务管理联系起来呢?
第三步:
通过代理把要管理的bean即:目标bean 和配置好的事务管理器融合在一起

beanNameAutoProxyCreator 为例
他需要二个参数 目标bean 拦截器
在上面我们已经定要好了 ,这里只需引用就行了

<bean class=”org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”> 

<property name’=”beanNames”> 

 <list> 

 <value>xsDao</value> 

 <value>XXXXX</value> 


 </list> 

</ property> 


<property name’=”interceptorNames”> 

 <list> 

 <value> transactionIntercepor </value> 

 <value>XXXXX</value> 


 </list> 

</ property> 

</bean>


这是对spring配置事务时大体步骤的一些理解。很肤浅