activiti事务和本身业务事务共同的使用

本人博客开始迁移,博客整个架构本身搭建及编码 http://www.cookqq.com/listBlog.action  java

一个数据库事务一般包含了一个序列的对数据库的读/写操做。它的存在包含有如下两个目的:spring

  1. 为数据库操做序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即便在异常状态下仍能保持一致性的方法。sql

  2. 当多个应用程序并发访问数据库时,能够在这些应用程序之间提供一个隔离方法,以防止彼此的操做互相干扰。数据库

相信每一个项目都有本身的事务控制管理方法。可是怎么和activiti的事务相结合使用呢? apache

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

可是,有的项目并无使用spring,那怎么控制事务呢?架构

一、建立activiti的配置信息:并发


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

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



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

三、设置数据库的DataSource 字体



conf.setDataSource(DBManager.getDataSource());

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


四、设置事务管理工厂(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就是建立工厂。很好理解。 五、建立引擎:



processEngine = conf.buildProcessEngine();

六、使用例子:



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()这个方法获取的事上面开启事务的哪个链接。

相关文章
相关标签/搜索