关于spring管理事务的学习总结。

时间:2022-05-05 20:35:16

一、最初的事务
接触事务最开始是没有使用框架开发的时候,用jdbc实现事务。在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作,每一个SQL语句都被认为是一个完整的事务处理。为了避免当执行两个语句的时候,一条提交成功而另一条失败的情况,需要把自动提交关闭,即取消掉每一个SQL语句执行后自动提交这个属性,并设立一个开关(commit())执行一些列语句的同一提交操作。简单的实现步骤就是:先关闭自动提交,然后执行sql语句,最后提交,用try-catch语句捕捉回滚。实现代码如下:

try {
conn.setAutoCommit(false);
String sql1="。。。";
stmt.executeUpdate(sql);
String sql2="。。。";
stmt.executeUpdate(sq2);
String sql3="。。。";
stmt.executeUpdate(sq3);
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}

二、Spring事务管理
用到框架开发,Spring必是首选的强大框架。Spring的事务管理分为声明式跟编程式。声明式就是在Spring的配置文件中进行相关配置;编程式就是用注解的方式写到代码里。Spring配置文件中关于事务配置总是由三个组成部分,分别DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化。Spring事务管理涉及的接口的联系如下:
关于spring管理事务的学习总结。
(一)JDBC事务
如果应用程序中直接使用JDBC来进行持久化,DataSourceTransactionManager会为你处理事务边界。为了使用DataSourceTransactionManager,你需要使用如下的XML将其装配到应用程序的上下文定义中:dataResource为数据源

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataResource"></property>
</bean>
    (二)Hibernate事务
如果应用程序的持久化是通过Hibernate实习的,那么你需要使用HibernateTransactionManager。对于Hibernate4,需要在Spring上下文定义中添加如下的<bean>声明:
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
sessionFactory属性需要装配一个Hibernate的session工厂,HibernateTransactionManager的实现细节是它将事务管理的职责委托给org.hibernate.Transaction对象,而后者是从Hibernate Session中获取到的。当事务成功完成时,HibernateTransactionManager将会调用Transaction对象的commit()方法,反之,将会调用rollback()方法。
(三)Java持久化API事务(JPA)、Java原生API事务省略。。。。。。

(一)(二)(三)前期配置选择一种即可,这里选择hibernate作为演示。事务配置后续配置(主要是编程式注解配置以及AOP声明式配置方式):
编程式注解配置

<context:annotation-config />
<tx:annotation-driven
transaction-manager="txManager" **proxy-target-class="true"** />

//配置事务管理器
<bean id="txManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">

<property name="sessionFactory"
ref="sessionFactory"/>

</bean>
代理方式:默认为javaJDK代理,加上proxy-target-class="true"为CGLIB代理
1)基于JavaJDK提供的动态代理,它是一个基于接口的代理方式;
2)Spring整合了CGLIB的事务代理,它是一个基于类的代理方式;

AOP声明式事务配置:

<tx:annotation-driven transaction-manager="transactionManager"  />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="set*" read-only="true" />
<tx:method name="query*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="load*" read-only="true" />
<tx:method name="count*" read-only="true" />
<tx:method name="save*" rollback-for="Exception" propagation="REQUIRED" />
<tx:method name="add*" rollback-for="Exception" />
<tx:method name="update*" rollback-for="Exception" />
<tx:method name="delete*" rollback-for="Exception" />
<tx:method name="merage*" rollback-for="Exception" />
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="serviceOperation" expression="execution(* com.lzt..*service..*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
</aop:config>

注:expression=”execution(* com.lzt..service..(..))”
其中第一个代表返回值,第二代表lzt下及其子包类接口,第三个*代表方法名,“(..)”代表方法参数。

以上为个人学习配置,不喜勿喷!