`
jinnianshilongnian
  • 浏览: 21504180 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2418707
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008811
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5639503
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259927
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597331
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250226
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858967
Group-logo
跟我学Nginx+Lua开...
浏览量:702014
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785227
社区版块
存档分类
最新评论

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

 
阅读更多


之前发过几篇关于Spring的总结帖子 反响还不错,再把剩下的几篇发上来。共享给大家。

我对IoC/DI的理解

我对AOP的理解

 

我对SpringDAO层支持的总结

 

 

1、问题
Connection conn = 
    DataSourceUtils.getConnection();
 //开启事务
conn.setAutoCommit(false);
try {
    Object retVal = 
        callback.doInConnection(conn);
    conn.commit(); //提交事务
    return retVal;
}catch (Exception e) {
    conn.rollback();//回滚事务
    throw e;
}finally {
    conn.close();
} 
Session session = null;
Transaction transaction = null;
try {
    session = factory.openSession();
    //开启事务
    transaction = session.beginTransaction();
    transation.begin();
    session.save(user);
    transaction.commit();//提交事务
} catch (Exception e) {
    e.printStackTrace();
    transaction.rollback();//回滚事务
    return false;
}finally{
    session.close();
}
  
缺点:不一致的事务管理,复杂  尤其当多个方法调用需要在同一个事务内时;


2、高层次解决方案
public interface PlatformTransactionManager {
    TransactionStatus getTransaction(TransactionDefinition definition)
        throws TransactionException;
    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;
} 
        //1.获取事务管理器
        PlatformTransactionManager txManager = (PlatformTransactionManager)             
             ctx.getBean("txManager");
        //2.定义事务属性
        DefaultTransactionDefinition td = new DefaultTransactionDefinition();
        td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
        //3开启事务,得到事务状态
        TransactionStatus status = txManager.getTransaction(td);
        try {
            //4.执行数据库操作
            System.out.println(jdbcTempate.queryForInt("select count(*) from tbl_doc"));
            //5、提交事务
            txManager.commit(status);
            
        }catch (Exception e) {
            //6、回滚事务
            txManager.rollback(status);
        }
   重复代码太多,而且必须手工开启/释放(提交/回滚)事务。

3、高层次模板解决方案
//1.获取事务管理器
PlatformTransactionManager txManager = (PlatformTransactionManager) 
       ctx.getBean("txManager");        
//2、定义事务管理的模板
TransactionTemplate transactionTemplate = new TransactionTemplate(txManager);
//3.定义事务属性
transactionTemplate.
    setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
//4.回调,执行真正的数据库操作,如果需要返回值需要在回调里返回
transactionTemplate.execute(new TransactionCallback() {
    @Override
    public Object doInTransaction(TransactionStatus status) {
    //5.执行数据库操作
    System.out.println(jdbcTempate.queryForInt("select count(*) from tbl_doc"));
    return null;
    }
});
需要写模板代码,我们知道事务其实是一个切面,因此我们通过AOP来解决

4AOP解决方案——一种声明时事务方案
nSpring框架提供了一致的事务管理抽象,这带来了以下好处:
1:为复杂的事务API提供了一致的编程模型,如JTAJDBCHibernateJPAJDO
2:支持声明式事务管理
3:提供比复杂的事务API(诸如JTA)更简单的、更易于使用的编程式事务管理API
4:非常好地整合Spring的各种数据访问抽象
实施事务的步骤
1、定义(资源)DataSource/SessionFactory……
2、定义事务管理器(管理资源的事务)
3、定义事务通知:定义了如何实施事务(实施事务的方法名和对应的事务属性),需要使用事务管理器管理事务,定义了如何选择目标对象的方法及实施的事务属性
4、定义advisor(切入点和事务通知):切入点选择需要实施事务的目标对象(一定是业务逻辑层)
5Spring织入事务通知到目标对象(AOP代理)


 


 


 


 
更多学习资料:
11
1
分享到:
评论
8 楼 jinnianshilongnian 2014-03-07  
Leon.Wood 写道
听说spring3+之后可以不需要jotm实现分布式事务,请问有相关文章么,

分布式事务跟spring无关 spring最终还是使用jta实现分布式事务 
7 楼 Leon.Wood 2014-03-07  
听说spring3+之后可以不需要jotm实现分布式事务,请问有相关文章么,
6 楼 yb1988 2012-11-08  
[/u][u]
引用
[url][/url][flash=200,200][/flash]
[align=center][/align][size=xx-small][/size][color=red][/color]
5 楼 sswh 2012-09-28  
jinnianshilongnian 写道

那就使用@Aspect 完成 不要再自己配置一个BeanNameAutoProxyCreator 这样可能产生代理的代理  可以通过@Order指定顺序


好的,我试一下看。

谢了~~
4 楼 jinnianshilongnian 2012-09-28  
sswh 写道
没想到回复这么快,呵呵。

我实际遇到的情形是这样的,以前的代码统一用的是@Transactional注解方式来添加事务的。

但我现在的需求是,想要在这些标识过@Transactional的类上,再加一个注解比如:@Guarded,然后我希望为加了@Guarded注解的类的特定方法(比如有@Pre注解的)添加拦截,
用于在方法调用前后做一些处理。

我自己新加的MethodInterceptor怎么才能共用@Transactional已生成的代理呢?

具体不知道要怎么配置才行。

再次表示感谢!!

那就使用@Aspect 完成 不要再自己配置一个BeanNameAutoProxyCreator 这样可能产生代理的代理  可以通过@Order指定顺序
3 楼 sswh 2012-09-28  
没想到回复这么快,呵呵。

我实际遇到的情形是这样的,以前的代码统一用的是@Transactional注解方式来添加事务的。

但我现在的需求是,想要在这些标识过@Transactional的类上,再加一个注解比如:@Guarded,然后我希望为加了@Guarded注解的类的特定方法(比如有@Pre注解的)添加拦截,
用于在方法调用前后做一些处理。

我自己新加的MethodInterceptor怎么才能共用@Transactional已生成的代理呢?

具体不知道要怎么配置才行。

再次表示感谢!!
2 楼 jinnianshilongnian 2012-09-28  
sswh 写道
请教一下,Spring事务注解@Transactional会为Bean对象生成一个代理,

如果由于其他原因,需要为Bean添加其他的拦截功能的话,比如:
另外再配置一个BeanNameAutoProxyCreator,对满足要求的Bean添加拦截功能,

这时候会形成最终拿到的Bean对象变成代理的代理,执行效率很差。
怎样合并多个MethodInterceptor的功能到一个代理中呢?
如果全部是自己配置的,那么可以在类似下面的interceptorNames中配置多个Interceptor,
<property name="interceptorNames">
<list>
<value>..111..</value>
<value>..222..</value>
</list>
</property>

但现在的问题是怎么让@Transactional注解和自己的MethodInterceptor共用一个代理呢?

多谢!


我的建议是使用统一的代理方式 这样会生成一个AOP代理

比如你用xml方式/AOP注解  就不要再额外配置一个BeanNameAutoProxyCreator (这样相当于创建多个AOP代理 即代理的代理 没有意义)
<property name="interceptorNames">
<list>
<value>..111..</value>
<value>..222..</value>
</list>
</property>

AOP代理内部其实是拦截器实现 一个AOP代理 多个拦截器
1 楼 sswh 2012-09-28  
请教一下,Spring事务注解@Transactional会为Bean对象生成一个代理,

如果由于其他原因,需要为Bean添加其他的拦截功能的话,比如:
另外再配置一个BeanNameAutoProxyCreator,对满足要求的Bean添加拦截功能,

这时候会形成最终拿到的Bean对象变成代理的代理,执行效率很差。
怎样合并多个MethodInterceptor的功能到一个代理中呢?
如果全部是自己配置的,那么可以在类似下面的interceptorNames中配置多个Interceptor,
<property name="interceptorNames">
<list>
<value>..111..</value>
<value>..222..</value>
</list>
</property>

但现在的问题是怎么让@Transactional注解和自己的MethodInterceptor共用一个代理呢?

多谢!

相关推荐

    Spring事务管理开发必备jar包

    本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...

    Spring 框架的事务管理及应用

    通过这种方式,应用程序中的对象只需要声明它们所需要的对象或服务,而具体的创建和管理则交由Spring容器负责。 - **IoC的好处**: - **解耦**:减少了组件之间的耦合度,提高了代码的可维护性和可测试性。 - **...

    简单Spring容器实现

    在IT行业中,Spring框架是Java应用开发中的一个关键组件...要成为Spring框架的专家,还需要对AOP、事务管理、Spring Boot、Spring Cloud等相关领域有深入的了解和实践经验。不断学习和实践,才能在IT行业中保持竞争力。

    spring事务管理5种方法

    Spring框架提供了对事务的声明式和编程式管理,以适应不同开发场景的需求。 1. 声明式事务管理: 声明式事务管理是Spring最常用的事务管理方式,它通过在配置文件或者注解中声明事务边界,将事务管理与业务代码...

    Spring框架的事务管理应用分析.doc

    通过XML配置或注解,开发者可以声明对象间的依赖关系,由Spring容器负责在运行时注入这些依赖。这种方式降低了对象间的耦合度,使得代码更易于测试和维护。 2. **Spring AOP(Aspect-Oriented Programming)** AOP...

    Spring事务与Java事务比较

    总结来说,Spring 框架的事务管理与 Java 原生的事务管理相比,具有更高的抽象层次和更好的可配置性,使得事务管理更加简单和高效。通过 Spring 的 IOC 容器和 AOP 机制,开发者可以更专注于业务逻辑的实现,而将...

    深入理解spring的事务管理机制

    2. **生成代理对象**:当Spring容器加载并创建Bean时,它会检查是否有使用了`@Transactional`注解的方法或类,并为这些方法或类生成代理对象。 3. **注入事务配置**:在代理对象中注入事务相关的配置,如事务的传播...

    Spring容器的通俗理解及简单写法

    Spring容器是Spring框架的核心组成部分,它负责管理对象的生命周期和对象间的依赖关系。在Java开发中,Spring容器(也称为ApplicationContext或BeanFactory)扮演着重要角色,它通过控制反转(Inversion of Control,...

    spring容器简单实例

    Spring容器是Spring框架的核心,负责管理对象的生命周期和依赖关系。主要有两种类型的容器:BeanFactory和ApplicationContext。BeanFactory是最基础的容器,而ApplicationContext提供了更多的企业级服务,如国际化...

    JavaEE spring半自动bean管理事务案例

    在JavaEE应用开发中,Spring框架是不可或缺的一部分,它提供了许多功能,其中之一就是对bean的管理以及事务处理。本案例将深入探讨Spring如何实现半自动的bean管理以及事务控制。 首先,Spring通过依赖注入...

    Spring源代码解析(六):Spring声明式事务处理.doc

    Spring 声明式事务处理 Spring 中的事务处理可以分为两种方式:声明式事务处理和编程式事务处理。...通过使用 AOP 和 IoC 容器,我们可以轻松地实现事务管理,并且可以灵活地配置事务管理的属性信息。

    spring事务案例分析.zip

    1. **Spring声明式事务管理**:这是Spring中最常用的一种事务管理方式,通过在方法上添加@Transactional注解,Spring容器会在方法执行前后自动进行事务的开启、提交、回滚等操作。例如,在业务服务类的方法上标注此...

    spring基于AspectJ实现事务控制

    1. **配置Spring容器**:在Spring的配置文件中,我们需要开启对AspectJ的支持。这通常涉及到添加`&lt;aop:aspectj-autoproxy&gt;`标签,它指示Spring使用AspectJ代理来创建bean。 ```xml ``` 2. **定义事务切面**:...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    在配置文件中,需要配置Spring的ApplicationContextListener监听器,以便在Web应用启动时加载Spring容器,同时还需要配置Struts2的Spring插件,使得Struts2能够识别Spring管理的bean。 总结,Ibatis通过其灵活的...

    spring事务管理.doc

    传统的全局事务管理方法是通过Enterprise JavaBeans (EJB) 的容器管理事务(CMT),但它与EJB紧密绑定,存在侵入性,并且需要应用服务器支持。 相反,局部事务是与特定资源(如JDBC连接)相关的,更容易使用,但不...

    Spring事务传播Demo.zip

    2. **声明式事务管理**:这是Spring更推荐的方式,通过在方法上添加@Transactional注解,Spring容器会在合适的时候自动进行事务管理。这种方式简化了代码,提高了可维护性。 接下来,我们关注"事务传播行为"。在...

    Spring事务管理的几种配置方式,

    总结,Spring的事务管理配置方式多样,可以根据项目需求选择合适的方案。声明式事务管理简化了代码,提高了可维护性,而编程式事务管理则提供了更大的灵活性。无论哪种方式,了解其原理和使用场景对于开发高效、可靠...

    spring容器学习笔记

    总结,Spring 容器是 Spring 框架的基石,负责管理和协调应用中的对象。通过 BeanFactory 和 ApplicationContext 接口,我们可以进行 Bean 的定义、配置、初始化和销毁,以及依赖注入。同时,Spring 容器还提供了...

    spring对多个数据库进行事务管理.doc

    Spring 框架确实提供了对多个数据库事务管理的支持,这对于多数据源的应用场景非常关键。在Spring中,事务管理可以通过编程式和声明式两种方式进行。编程式事务管理需要程序员手动控制事务的开始、提交、回滚等操作...

Global site tag (gtag.js) - Google Analytics