spring框架的事务管理

来源:互联网 发布:网页制作软件手机 编辑:程序博客网 时间:2024/05/16 07:09
spring提供的事务处理可分为两类:编程式的事务和声明式的事务。

先看看传统的JDBC事务。一般是得到数据源,然后获得连接Connection,数据源一般由容器管理,一般的应用服务器具备这个功能,并且,连接和数据源不同,它并不时线程安全的,所以每次都要新建连接,并且在结束时关闭。传统JDBC事务管理示例代码:
Connect con = null;
try{
    con 
= DBFactory.getConnection();
    con 
= setAutoCommit(false);
    
/* 
数据库操作  */
    con.commit();  
//提交
}
catch(Exception e){
    con.rollback();
}

finally{
    con.close();
}
缺点:代码长,重复代码很多,容易出错,一旦忘记关连接,错误严重。

再来就是spring提供的编程式事务处理
TranscationDefinition 事务属性定义;TranscationStats当前事务,可以提交、回滚;
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类 AbstractPlatformTransactionManager,我们使用的事务管理类例如 DataSourceTransactionManager等都是这个类的子类。
使用spring编程式事务流程(示例代码):
TranscationDefinition td = new TranscationDefinition();
TranscationStats ts 
= transcationManager.getTrancation(td);
try{
   
/*  数据库操作  */
    transcationManager.commit(ts);
//提交
}
catch(Exception e){
    transcationManager.rollback(ts);
}

这里,也可以使用spring的事务模板,利用回调来做,可以省去提交和回滚的代码量
示例代码:
TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts 
= transactionManager.getTransaction(td);
void add(){
     transactionTemplate.execute(
new TransactionCallback(){
         
public Object doInTransaction(TransactionStatus ts)
//注入数据库管理对象
             
/* 数据库操作 */
         }

     }
)
}

最厉害的一种,spring声明式事务管理,声明式事务不再为EJB独有。
实现了AOP思想,提供TransactionInterceptor拦截器以及TransactionProxyFactoryBean代理类,对组件进行事务代理
在spring1.x和spring2,声明式事务管理的配置有一定差异,spring2做了优化,篇幅原因,详细内容可参照我另一篇笔记 "spring1.x与spring2声明式事务管理的配置"
原创粉丝点击