学堂 学堂 学堂公众号手机端

activiti事务和业务事务共同使用的方法

lewis 1年前 (2024-04-11) 阅读数 21 #技术

今天小编给大家分享一下activiti事务和业务事务共同使用的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

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

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


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

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

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

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

1、创建activiti的配置信息:

StandaloneProcessEngineConfigurationconf=(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这个方法时我自己写的,下面会详细介绍):

CustomJdbcTransactionFactoryjdbcTransactionFactory=
					newCustomJdbcTransactionFactory();
			conf.setTransactionFactory(jdbcTransactionFactory);

重点就是在这了。

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

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

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

import java.sql.Connection;

importjava.sql.SQLException;

importjavax.sql.DataSource;

importorg.apache.ibatis.logging.Log;
importorg.apache.ibatis.logging.LogFactory;
importorg.apache.ibatis.session.TransactionIsolationLevel;
importorg.apache.ibatis.transaction.jdbc.JdbcTransaction;

importcom.fangdo.core.db.DBManager;

publicclassCustomJdbcTransactionextendsJdbcTransaction{

	privatestaticfinalLoglog=LogFactory.getLog(CustomJdbcTransaction.class);
	publicCustomJdbcTransaction(Connectionconnection){
		super(connection);
	}

	publicCustomJdbcTransaction(DataSourceds,
			TransactionIsolationLeveldesiredLevel,booleandesiredAutoCommit){
		super(ds,desiredLevel,desiredAutoCommit);
	}

	@Override
	protectedvoidopenConnection()throwsSQLException{
//		super.openConnection();
		connection=DBManager.getConnection();
		if(log.isDebugEnabled()){
	log.debug("{CustomJdbcTransaction}OpenningJDBCConnection"+connection.hashCode()+"[]"+autoCommmit);
	}
//	connection=dataSource.getConnection();
	if(level!=null){
	connection.setTransactionIsolation(level.getLevel());
	}
	setDesiredAutoCommit(autoCommmit);
	}

	@Override
	publicvoidclose()throwsSQLException{
		if(log.isDebugEnabled()){
		log.debug("{CustomJdbcTransaction}closingJDBCConnection"+connection.hashCode());
		}
//		super.close();
	}

	@Override
	publicvoidcommit()throwsSQLException{
		//TODOAuto-generatedmethodstub
//		super.commit();
	}

	@Override
	publicvoidrollback()throwsSQLException{
		//TODOAuto-generatedmethodstub
//		super.rollback();
	}
}

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

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

importjava.sql.Connection;
importjava.util.Properties;

importjavax.sql.DataSource;

importorg.apache.ibatis.session.TransactionIsolationLevel;
importorg.apache.ibatis.transaction.Transaction;
importorg.apache.ibatis.transaction.jdbc.JdbcTransaction;
importorg.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

publicclassCustomJdbcTransactionFactoryextendsJdbcTransactionFactory{

	@Override
	publicvoidsetProperties(Propertiesprops){
		super.setProperties(props);
	}

	@Override
	publicTransactionnewTransaction(Connectionconn){
//		returnsuper.newTransaction(conn);
		returnnewCustomJdbcTransaction(conn);
	}

	@Override
	publicTransactionnewTransaction(DataSourceds,
			TransactionIsolationLevellevel,booleanautoCommit){
//		returnsuper.newTransaction(ds,level,autoCommit);
		returnnewCustomJdbcTransaction(ds,level,autoCommit);
	}

}

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

processEngine=conf.buildProcessEngine();

6、使用例子:

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

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

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

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

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

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

以上就是“activiti事务和业务事务共同使用的方法”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注博信行业资讯频道。

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门