activiti事务和自己业务事务共同的使用

来源:互联网 发布:ubuntu zip压缩命令 编辑:程序博客网 时间:2024/06/05 11:55

一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:

  1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  2. 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

相信每个项目都有自己的事务控制管理方法。但是怎么和activiti的事务相结合使用呢?

activiti基于spring的事务集成网上的资料很多。这里省略1000字。

但是,有的项目并没有使用spring,那怎么控制事务呢?

1、创建activiti的配置信息:

StandaloneProcessEngineConfiguration conf = (StandaloneProcessEngineConfiguration) ProcessEngineConfiguration                    .createStandaloneProcessEngineConfiguration();

2、设置activiti配置信息(比如是否自动更新,是否使用历史,字体...):

conf.setDatabaseSchemaUpdate("true");            conf.setDbHistoryUsed(true);            conf.setHistory("full");            conf.setActivityFontName("宋体");            conf.setJobExecutorActivate(false);

3、设置数据库的DataSource

conf.setDataSource(DBManager.getDataSource());

请注意:这个DBManager.getDataSource()是自己封装的代码。

4、设置事务管理工厂(CustomJdbcTransactionFactory这个方法时我自己写的,下面会详细介绍):

CustomJdbcTransactionFactory jdbcTransactionFactory=                    new CustomJdbcTransactionFactory();            conf.setTransactionFactory(jdbcTransactionFactory);

重点就是在这了。

自己的事务会开启一个数据库连接Connection conn = dataSource.getConnection(),自己的所有操作都会在这个连接中完成。activiti的操作数据的时候也会打开一个连接dataSource.getConnection(),操作自己的数据。那就会出现问题,不在同一个连接中,何谈事务啊?

StandaloneProcessEngineConfiguration 中有个变量事务管理器。

我们可以重写事务管理器里面打开连接的方法,然后再set配置对象conf中。

import java.sql.Connection;

import java.sql.SQLException;import javax.sql.DataSource;import org.apache.ibatis.logging.Log;import org.apache.ibatis.logging.LogFactory;import org.apache.ibatis.session.TransactionIsolationLevel;import org.apache.ibatis.transaction.jdbc.JdbcTransaction;import com.fangdo.core.db.DBManager;public class CustomJdbcTransaction extends JdbcTransaction {    private static final Log log = LogFactory.getLog(CustomJdbcTransaction.class);    public CustomJdbcTransaction(Connection connection) {        super(connection);    }    public CustomJdbcTransaction(DataSource ds,            TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {        super(ds, desiredLevel, desiredAutoCommit);    }    @Override    protected void openConnection() throws SQLException {//      super.openConnection();        connection = DBManager.getConnection();        if (log.isDebugEnabled()) {          log.debug("{CustomJdbcTransaction } Openning JDBC Connection"+connection.hashCode()+"[]"+autoCommmit);        }//      connection = dataSource.getConnection();        if (level != null) {          connection.setTransactionIsolation(level.getLevel());        }        setDesiredAutoCommit(autoCommmit);    }    @Override    public void close() throws SQLException {        if (log.isDebugEnabled()) {              log.debug("{CustomJdbcTransaction } closing JDBC Connection"+connection.hashCode());            }//      super.close();    }    @Override    public void commit() throws SQLException {        // TODO Auto-generated method stub//      super.commit();    }    @Override    public void rollback() throws SQLException {        // TODO Auto-generated method stub//      super.rollback();    }}

重写了openConnection()方法,获取数据库连接是我业务打开的那个连接。

连接关闭close(),提交commit(),回滚rollback() ,全部注销了。对数据库连接的操作都有我业务来控制,不让activiti控制了。

import java.sql.Connection;import java.util.Properties;import javax.sql.DataSource;import org.apache.ibatis.session.TransactionIsolationLevel;import org.apache.ibatis.transaction.Transaction;import org.apache.ibatis.transaction.jdbc.JdbcTransaction;import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;public class CustomJdbcTransactionFactory extends JdbcTransactionFactory {    @Override    public void setProperties(Properties props) {        super.setProperties(props);    }    @Override    public Transaction newTransaction(Connection conn) {//      return super.newTransaction(conn);        return new CustomJdbcTransaction(conn);    }    @Override    public Transaction newTransaction(DataSource ds,            TransactionIsolationLevel level, boolean autoCommit) {//      return super.newTransaction(ds, level, autoCommit);        return new CustomJdbcTransaction(ds, level, autoCommit);    }}

CustomJdbcTransactionFactory就是创建工厂。很好理解。 5、创建引擎:

processEngine = conf.buildProcessEngine();

6、使用例子:

QueryHelper.startTransaction();//开启事务            taskService.claim(taskId, getPhoneId());            taskService.complete(taskId, variables);            。。。。。//自己的业务代码            QueryHelper.endTransaction();//关闭事务

自己业务和activiti共用了同一个事务,如果抛出异常,就会回滚回去了。

这里简单说一个,QueryHelper.startTransaction()主要做的事情:

Connection conn = dataSource.getConnection();conn.setAutoCommit(false);

QueryHelper.endTransaction()主要做的事情是:

Connection connection = getConnection();            connection.commit();//提交JDBC事务            connection.setAutoCommit(true);// 恢复JDBC事务的默认提交方式

getConnection()这个方法获取的事上面开启事务的哪一个连接。

0 0
原创粉丝点击