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

我对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杂谈 作者zhang KaiTao

    1.16 我对Spring 容器管理事务支持的总结 1.17 我对Spring 容器管理事务支持的总结 1.18 不重复配置——利用Spring通用化配置 1.19 @Value注入Properties 错误的使用案例 1.20 @Value注入Properties 使用错误的案例 ...

    Spring 框架的事务管理及应用

    。Spring 框架 由一个容器,一个配置和组织组件的框架,和一组内置的为事务、持久化和Web 用户接口提供的服务组成。作为一种轻量级的J2EE 框架

    spring 容器.docx

    他们都可代表Spring容器,Spring容器是生成Bean实例的工厂,并且管理容器中的Bean。 Bean是Spring管理的基本单位,在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源、Hibernate的...

    spring源码分析(1-10)

    Spring源代码解析(二):ioc容器在Web容器中的启动 Spring源代码分析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源代码解析(六):Spring声明式事务处理...

    spring3hibernate4注解式事务管理

    spring3hibernate4注解式事务管理

    基于java的企业级应用开发:声明式事务管理.ppt

    5.2.2 基于Annotation方式的声明式事务 基于Annotation方式的声明式事务 1 在Spring容器中注册事务注解驱动; 2 在需要事务管理的类或方法上使用@Transactional注解。 ...

    Spring攻略PDF版

     第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring与其他Web框架   第12章 Spring对测试的支持  第三部分 高级主题  第13章 Spring ...

    Spring攻略中文版PDF

     第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring与其他Web框架   第12章 Spring对测试的支持  第三部分 高级主题  第13章 Spring ...

    Spring攻略英文版(附带源码)

     第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring与其他Web框架   第12章 Spring对测试的支持  第三部分 高级主题  第13章 Spring Security...

    Spring+3.x企业应用开发实战光盘源码(全)

     第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。  第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的...

    spring培训-笔记

    目录: Spring教程 1 名词解释 2 Spring框架概述 3 Spring是什么?...Spring的历史 4 ...Spring对其它企业应用支持 22 注:后面的内容我将不再完善,但网上的朋友可以帮助完善,只需注明住处即可。

    Spring教程  主要内容:介绍Spring的历史,Spring的概论和它的体系结构,重点阐述它在J2EE中扮演的角色。

    作者:钱安川(Moxie) 注:后面的内容我将不再完善,但网上的朋友可以帮助完善,只需注明住处即可。 Spring教程 1 Spring框架概述 3 Spring是什么? 3 Spring的历史 4 ...Spring对其它企业应用支持 22

    Spring框架.ppt

    核心容器。...通过配置管理特性,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块直接将面向方面编程的功能集成到Spring框架中。它为基于Spring 应用程序的对象提供了事务管理服务。

    Spring_aop源码

    所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序...

    Spring.html

    概念:面向切面编程,在不改变源码的情况下对方法进行增强,抽取横切关注点(日志处理,事务管理,安全检查,性能测试等等),使用AOP进行增强,使程序员只需要关注与业务逻辑编写. 专业术语 目标Target:需要增强的类 ...

    全网最热spring问题总结.pdf

    容器: Spring 包含并管理应用中对象的生命周期和配置。 MVC 框架: Spring 的 WEB 框架是个精心设计的框架, 是 Web 框架的 一个很好的替代品。 事务管理: Spring 提供一个持续的事务管理接口, 可以扩展到上至...

    spring源码分析

    Spring源代码解析(二):ioc容器在Web容器中的启动 3.Spring源代码解析(三):Spring JDBC 4.Spring源代码解析(四):Spring MVC 5.Spring源代码解析(五):Spring AOP获取Proxy 6. Spring源代码解析(六):Spring...

    Spring源代码解析

    Spring源代码解析(六):Spring声明式事务处理 Spring源代码解析(七):Spring AOP中对拦截器调用的实现 Spring源代码解析(八):Spring驱动Hibernate的实现 Spring源代码解析(九):Spring Acegi框架鉴权的实现 ...

    Spring 3.0就这么简单源代码

    本书主要介绍了Spring 3.0的核心内容,不仅讲解了Spring 3.0的基础知识,还深入讨论了Spring IoC容器、Spring AOP、使用Spring JDBC访问数据库、集成Hibernate、Spring的事务管理、Spring MVC、单元测试、敏捷开发...

    Spring源码学习文档,绝对值得好好研究~~

    Spring源代码解析(二):ioc容器在Web容器中的启动.doc Spring源代码分析(三):Spring JDBC.doc Spring源代码解析(四):Spring MVC.doc Spring源代码解析(五):Spring AOP获取Proxy.doc Spring源代码解析(六):...

Global site tag (gtag.js) - Google Analytics