对Spring 容器管理事务支持的总结

1、问题

Java代码  

  1. Connection conn =
  2. DataSourceUtils.getConnection();
  3. //开启事务
  4. conn.setAutoCommit(false);
  5. try {
  6. Object retVal =
  7. callback.doInConnection(conn);
  8. conn.commit(); //提交事务
  9. return retVal;
  10. }catch (Exception e) {
  11. conn.rollback();//回滚事务
  12. throw e;
  13. }finally {
  14. conn.close();
  15. }

Java代码  

  1. Session session = null;
  2. Transaction transaction = null;
  3. try {
  4. session = factory.openSession();
  5. //开启事务
  6. transaction = session.beginTransaction();
  7. transation.begin();
  8. session.save(user);
  9. transaction.commit();//提交事务
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. transaction.rollback();//回滚事务
  13. return false;
  14. }finally{
  15. session.close();
  16. }

缺点:不一致的事务管理,复杂  尤其当多个方法调用需要在同一个事务内时;

2、高层次解决方案

Java代码  

  1. public interface PlatformTransactionManager {
  2. TransactionStatus getTransaction(TransactionDefinition definition)
  3. throws TransactionException;
  4. void commit(TransactionStatus status) throws TransactionException;
  5. void rollback(TransactionStatus status) throws TransactionException;
  6. }

Java代码  

  1. //1.获取事务管理器
  2. PlatformTransactionManager txManager = (PlatformTransactionManager)
  3. ctx.getBean("txManager");
  4. //2.定义事务属性
  5. DefaultTransactionDefinition td = new DefaultTransactionDefinition();
  6. td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
  7. //3开启事务,得到事务状态
  8. TransactionStatus status = txManager.getTransaction(td);
  9. try {
  10. //4.执行数据库操作
  11. System.out.println(jdbcTempate.queryForInt("select count(*) from tbl_doc"));
  12. //5、提交事务
  13. txManager.commit(status);
  14. }catch (Exception e) {
  15. //6、回滚事务
  16. txManager.rollback(status);
  17. }

重复代码太多,而且必须手工开启/释放(提交/回滚)事务。

3、高层次模板解决方案

Java代码  

  1. //1.获取事务管理器
  2. PlatformTransactionManager txManager = (PlatformTransactionManager)
  3. ctx.getBean("txManager");
  4. //2、定义事务管理的模板
  5. TransactionTemplate transactionTemplate = new TransactionTemplate(txManager);
  6. //3.定义事务属性
  7. transactionTemplate.
  8. setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
  9. //4.回调,执行真正的数据库操作,如果需要返回值需要在回调里返回
  10. transactionTemplate.execute(new TransactionCallback() {
  11. @Override
  12. public Object doInTransaction(TransactionStatus status) {
  13. //5.执行数据库操作
  14. System.out.println(jdbcTempate.queryForInt("select count(*) from tbl_doc"));
  15. return null;
  16. }
  17. });

需要写模板代码,我们知道事务其实是一个切面,因此我们通过AOP来解决

4、AOP解决方案——一种声明时事务方案

nSpring框架提供了一致的事务管理抽象,这带来了以下好处:

1:为复杂的事务API提供了一致的编程模型,如JTA、JDBC、Hibernate、JPA和JDO

2:支持声明式事务管理

3:提供比复杂的事务API(诸如JTA)更简单的、更易于使用的编程式事务管理API

4:非常好地整合Spring的各种数据访问抽象

实施事务的步骤

1、定义(资源)DataSource/SessionFactory……

2、定义事务管理器(管理资源的事务)

3、定义事务通知:定义了如何实施事务(实施事务的方法名和对应的事务属性),需要使用事务管理器管理事务,定义了如何选择目标对象的方法及实施的事务属性

4、定义advisor(切入点和事务通知):切入点选择需要实施事务的目标对象(一定是业务逻辑层)

5、Spring织入事务通知到目标对象(AOP代理)

时间: 2024-11-07 19:58:53

对Spring 容器管理事务支持的总结的相关文章

Spring容器管理各种文件

1. 导入文件 <import resource="applicationContext-dataSource.xml" /> 2. 引用资源配置文件 <context:property-placeholder location="classpath:jdbc.properties,classpath:xxx.properties"/> 或者 <context:property-placeholder location="xx

Spring怎么管理事务?

我们一般通过aop管理事务,就是把代码看成一个纵向有序的,然后通过aop管理事务,就好比增删改的时候需要开启一个事务,我们给他配置一个required,required就是有事务就执行事务,没有就给他创建一个事务.查的时候不需要开启事务,就给他配置一个supports,supports就是说他有事务就执行事务,没有的话就不执行. 事务四特性: ACID ----->原子性(事务操作最基本单元,要么全部成功,要么全部失败) 一致性(指一个事务执行之前和执行之后数据库都必须处于一致性状态,事务成功,

Spring加载applicationContext.xml实现spring容器管理的单例模式

package com.etc.pojo; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpUtil { static private ApplicationContext ac; static { ac = new ClassPathXmlApplicat

Spring AOP 管理事务

<aop:config proxy-target-class="true"> <aop:pointcut expression="execution(* com.jikexueyuan.dao.impl.*.*(..))" id="cut"/> <aop:advisor advice-ref="defaultTransactionAdvice" pointcut-ref="cut&quo

Spring整合JDBC以及AOP管理事务

本节内容: Spring整合JDBC Spring中的AOP管理事务 一.Spring整合JDBC Spring框架永远是一个容器,Spring整合JDBC其实就是Spring提供了一个对象,这个对象封装了JDBC技术,它可以操作数据库,这个对象可以放入Spring容器,交给Spring容器来管理.所以我们主要是要学习这个对象:JDBCTemplate.这个对象和DBUtils中的QueryRunner非常相似. 1. 导包 4+2+2(测试需要的包spring-test,新版本测试时还需要sp

spring+springMVC中使用@Transcational方式管理事务的必须要配的东西。

spring中管理事务的配置方式除了@Transcational还有使用aop等,本文介绍@Transcational方式,但是推荐使用aop方式.因为如果有多个事务管理器的话,你在注解中还需要注明使用哪个事务管理器@Transactional("transactionManager1"). 一.spring中一定要记得加载所有需要的bean 如果使用注解方式的话一定要记得扫描注解,下边的例子表示扫描xxx.xxx下所有文件(包含每一级子文件夹)中除了@Controller以外的所有注

spring声明式事务配置详解

spring声明式事务配置详解 君子不器 2013年06月16日 编程世界 5273次阅读 查看评论 理解Spring的声明式事务管理实现 本节的目的是消除与使用声明式事务管理有关的神秘性.简单点儿总是好的,这份参考文档只是告诉你给你的类加上@Transactional注解,在配置文件中添加('<tx:annotation-driven/>')行,然后期望你理解整个过程是怎么工作的.此节讲述Spring的声明式事务管理内部的工作机制,以帮助你在面对事务相关的问题时不至于误入迷途,回朔到上游平静

Spring容器装饰者模式应用之实现业务类与服务类自由组合的解决方案

在任何一个项目中都不可或缺的存在两种bean,一种是实现系统核心功能的bean,我们称之为业务类,另外一种是与系统核心业务无关但同时又提供十分重要服务bean,我们称之为服务类.业务类的bean根据每个系统自身核心功能的不同可以有任意多个,但是服务类的种类在各个系统之间的差异却并不是很大.在系统中经常用到的服务有以下几种,权限服务,日志服务,缓存服务,事务服务以及预警服务等.在整个系统的不断进化过程中,服务类与业务类的关系也不断的发生着变化,由当初垂直模式变为横切模式,这也是编程思想不断演化过程

Spring-----4、使用Spring容器

Spring有两个核心接口:BeanFactory和ApplicationContext(BeanFactory的子接口):他们都可代表Spring容器,Spring容器是生成Bean实例的工厂,并管理容器中的Bean:Bean是Spring管理的基本单位,在基于Spring的JavaEE应用中,所有的组件都被当成Bean处理,包括数据源.Hibernate的SesisonFactoy.事务管理器等 应用中的所有组件,都处于Spring的管理下,都被Spring以Bean的方式管理,Spring