文档章节

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

cookqq
 cookqq
发布于 2013/11/22 15:07
字数 866
阅读 4.4K
收藏 6

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

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

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














© 著作权归作者所有

cookqq

cookqq

粉丝 119
博文 268
码字总数 156096
作品 0
海淀
技术主管
私信 提问
Spring 开发比较复杂的业务,划分为多层Service,如何把握事务最佳的设置。

基于 Spring 的环境开发,由于业务系统的复杂性,如果直接在接口业务层做业务,复杂的东西和接口数据耦合太严重(比如蛋疼的VO、DTO之类的数据转换都要耦合在一块,你想在系统内部调用都有点...

蓝水晶飞机
2018/11/24
365
1
Activiti工作流引擎使用

Activiti工作流引擎使用 1.简单介工作流引擎与Activiti 对于工作流引擎的解释请参考百度百科:工作流引擎 1.1 我与工作流引擎 在第一家公司工作的时候主要任务就是开发OA系统,当然基本都 是...

jxlgzwh
2014/09/25
921
0
tapestry activiti开发笔记

开发环境的准备: eclipse: kapler plugin: http://activiti.org/designer/update/ tapestry-activiti-0.0.1 tapestry-core: 5.4-beta-6 database:mysql5.5.29 activiti : 5.15.1 <dependen......

zhouyc
2014/05/28
909
0
带你进入 Activiti 工作流的世界

Activiti 是一个针对企业用户、开发人员 、系统管理员的轻量级工作流业务管理平台,其核心是使用 java 开发的快速 、 稳定的 BPMN2.0 流程引擎 。它可以与 spring 完美集成。 创始人 Tom Ba...

deniro
2018/06/17
0
0
工作流引擎 flowable 5.22.0,完全兼容 Activiti

2016年10月13日,从工作流引擎 Activiti 分支出的新项目 Flowable 发布了首个版本 flowable-5.22.0 ,可无缝替代activiti-5.21.0 。 亮点: 无缝替代 activiti-5.21.0 。除了修改 Maven 的 gr...

viruscamp
2016/10/28
1.1W
8

没有更多内容

加载失败,请刷新页面

加载更多

处理CSV文件中的逗号

我正在寻找有关如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且该值可能带有逗号(例如公司名称)。 我们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|...

javail
今天
37
0
如何克隆一个Date对象?

将Date变量分配给另一个变量会将引用复制到同一实例。 这意味着更改一个将更改另一个。 如何实际克隆或复制Date实例? #1楼 简化版: Date.prototype.clone = function () { return new ...

技术盛宴
今天
58
0
计算一个数的数位之和

计算一个数的数位之和 例如:128 :1+2+8 = 11 public int numSum(int num) { int sum = 0; do { sum += num % 10; } while ((num = num / 10) > 0); return sum;......

SongAlone
今天
67
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
今天
47
0
每天AC系列(二):最接近的三数之和

1 题目 leetcode第16题,给定一个数组与一个目标数,找出数组中其中的三个数,这三个数的和要与目标数最接近。 2 暴力 按惯例先来一次O(n3)的暴力: int temp = nums[0]+nums[1]+nums[2];fo...

Blueeeeeee
今天
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部