哈哈,有人在我的blog上留言说也在学习spring,能不能传个例子共同学习一下spring的事物管理,我也是学了个一知半解,刚刚研究了研究。将其中的一点自己的理解写下来,共同学习。
Spring的事物管理有两种,一种是代码控制事物,一种是声明控制实现事物管理(也就是xml配置),咱先来说用代码控制实现事物管理,这种方式又分为两类,一种是实现PlatformTransactionManager接口的方法
查了一下帮助文档,实现了PlatformTransactionManager接口的有好多类,下面的例子代码是用的其中的DataSourceTransactionManager.
这是模拟用户注册的一个例子,下面的类实现于自定义接口UserLoginInterface(spring提倡的面向)该类里面定义了两个属性,一个是Spring的jdbc模版类,一个是事务管理器,并都提供了set方法,这两个对象将在Ioc中自动初始化加载。其中有一个叫UserInfoVO的值对象类,用来传递用户注册信息
//用代码控制实现事务管理其中的实现PlatformTransactionManager接口的方法
import java.util.*;
import org.springframework.context.*;
import org.springframework.jdbc.core.*;
import org.springframework.transaction.*;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.support.DefaultTransactionDefinition;
public class UserLoginImple implements UserLoginInterface
{
//Spring jdbc模版类
private JdbcTemplate jdbcTemplate;
//事务管理器 PlatformTransactionManager是一个接口
private PlatformTransactionManager transactionManager
//jdbc模版类对象的set方法
public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
{
this.jdbcTemplate = jdbcTemplate;
}
//事务管理器的set方法
public void setTransactionManager(PlatformTransactionManager transactionManager)
{
this.transactionManager = transactionManager;
}
//插入用户信息的方法
public boolean doUpdateUserInfo(UserInfoVO oneUserInfo)
{
//定义两个sql插入语句
String sql = "update userinfo set userPassword=? where userName=?";
String sql2 = "update userinfo1 set userPassword=? where userName=?";
DefaultTransactionDefinition dtf = new DefaultTransactionDefinition();//事务定义
TransactionStatus status = this.transactionManager.getTransaction(dtf);//事务状态
try
{
this.jdbcTemplate.update(sql, new Object[]
{oneUserInfo.getUserName(),
oneUserInfo.getUserPassword()});
this.jdbcTemplate.update(sql2, new Object[]
{oneUserInfo.getUserName(),
oneUserInfo.getUserPassword()});
this.transactionManager.commit(status);
}
catch(Exception ex)
{
this.transactionManager.rollback(status);
return false;
}
return true;
}
}
关键看加粗的部分,首先定义一个事务,然后以这个事务为参数通过事务管理器创建一个事务状态,开始执行sql代码,最后事务管理器提交事务状态,完成。其间如果出现异常,事务管理器回滚事务状态。
我理解着,这里面用了设计模式中的一个叫Command命令的模式,首先定义一个执行者(事务对象),然后赋予执行者使命(事务状态),命令执行者执行其被赋予的使命,如果失败,命令执行者撤销执行的使命。
不知道理解的对不对,呵呵。