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

一、最初的事务
接触事务最开始是没有使用框架开发的时候,用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事务管理涉及的接口的联系如下:
这里写图片描述
(一)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下及其子包类接口,第三个*代表方法名,“(..)”代表方法参数。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值