2007年1月6日星期六

学习Spring的事务管理(一)

哈哈,有人在我的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命令的模式,首先定义一个执行者(事务对象),然后赋予执行者使命(事务状态),命令执行者执行其被赋予的使命,如果失败,命令执行者撤销执行的使命。

不知道理解的对不对,呵呵。

没有评论:

发表评论