spring提供的事务处理可分为两类:编程式的事务和声明式的事务。
先看看传统的JDBC事务。一般是得到数据源,然后获得连接Connection,数据源一般由容器管理,一般的应用服务器具备这个功能,并且,连接和数据源不同,它并不时线程安全的,所以每次都要新建连接,并且在结束时关闭。传统JDBC事务管理示例代码:
缺点:代码长,重复代码很多,容易出错,一旦忘记关连接,错误严重。
再来就是spring提供的编程式事务处理
TranscationDefinition 事务属性定义;TranscationStats当前事务,可以提交、回滚;
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类 AbstractPlatformTransactionManager,我们使用的事务管理类例如 DataSourceTransactionManager等都是这个类的子类。
使用spring编程式事务流程(示例代码):
这里,也可以使用spring的事务模板,利用回调来做,可以省去提交和回滚的代码量
示例代码:
最厉害的一种,spring声明式事务管理,声明式事务不再为EJB独有。
实现了AOP思想,提供TransactionInterceptor拦截器以及TransactionProxyFactoryBean代理类,对组件进行事务代理
在spring1.x和spring2,声明式事务管理的配置有一定差异,spring2做了优化,篇幅原因,详细内容可参照我另一篇笔记 "spring1.x与spring2声明式事务管理的配置"
先看看传统的JDBC事务。一般是得到数据源,然后获得连接Connection,数据源一般由容器管理,一般的应用服务器具备这个功能,并且,连接和数据源不同,它并不时线程安全的,所以每次都要新建连接,并且在结束时关闭。传统JDBC事务管理示例代码:
Connect con
=
null
;
try {
con = DBFactory.getConnection();
con = setAutoCommit(false);
/* 数据库操作 */
con.commit(); //提交
}
catch (Exception e) {
con.rollback();
}
finally {
con.close();
}
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);
}
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){ //注入数据库管理对象
/* 数据库操作 */
}
})
}
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声明式事务管理的配置"