关于spring管理事务的学习总结。
2017-04-18 15:47
573 查看
一、最初的事务
接触事务最开始是没有使用框架开发的时候,用jdbc实现事务。在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作,每一个SQL语句都被认为是一个完整的事务处理。为了避免当执行两个语句的时候,一条提交成功而另一条失败的情况,需要把自动提交关闭,即取消掉每一个SQL语句执行后自动提交这个属性,并设立一个开关(commit())执行一些列语句的同一提交操作。简单的实现步骤就是:先关闭自动提交,然后执行sql语句,最后提交,用try-catch语句捕捉回滚。实现代码如下:
二、Spring事务管理
用到框架开发,Spring必是首选的强大框架。Spring的事务管理分为声明式跟编程式。声明式就是在Spring的配置文件中进行相关配置;编程式就是用注解的方式写到代码里。Spring配置文件中关于事务配置总是由三个组成部分,分别DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化。Spring事务管理涉及的接口的联系如下:
(一)JDBC事务
如果应用程序中直接使用JDBC来进行持久化,DataSourceTransactionManager会为你处理事务边界。为了使用DataSourceTransactionManager,你需要使用如下的XML将其装配到应用程序的上下文定义中:dataResource为数据源
(一)(二)(三)前期配置选择一种即可,这里选择hibernate作为演示。事务配置后续配置(主要是编程式注解配置以及AOP声明式配置方式):
编程式注解配置
AOP声明式事务配置:
注:expression=”execution(* com.lzt..service..(..))”
其中第一个代表返回值,第二代表lzt下及其子包类接口,第三个*代表方法名,“(..)”代表方法参数。
以上为个人学习配置,不喜勿喷!
接触事务最开始是没有使用框架开发的时候,用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下及其子包类接口,第三个*代表方法名,“(..)”代表方法参数。
以上为个人学习配置,不喜勿喷!
相关文章推荐
- Spring学习总结9(基于Hibernate的事务管理)
- spring 事务管理的学习总结
- spring学习总结(十二):spring 中的事务管理
- 学习Spring的事务管理(一)
- 学习《JSP项目开发全程实录》中的企业人力资源管理系统(spring1.2+sturts1.2+hibernate3.0)的一些过程总结之管理员登录ACTION的实现
- Spring学习笔记(15)----使用Spring注解方式管理事务
- 开源框架spring学习之道:事务管理的深刻理解
- spring 事务管理配置总结
- 学习Spring的事务管理(二)
- 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结
- spring事务管理总结
- 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结
- Java学习之道:纯Hibernate使用-不用spring事务管理
- Spring视频学习(九)使用Spring注解方式管理事务与传播行为详解
- OA中总结:s:select,关于使用modelDriven,项目分层,@Transactional,jspf,各个层上配置注解交给spring管理的方法,简单的OGNL表达式写法
- 关于spring声明式事务管理异常处理的测试和小结
- Spring总结之事务管理
- spring学习笔记:spring事务管理
- 关于spring的有关学习知识总结
- 关于spring中注入连接池,事务管理等有关的属性设置以后可能用得到