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

94次阅读
没有评论

共计 4384 个字符,预计需要花费 11 分钟才能阅读完成。

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

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

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

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

相信每个项目都有自己的事务控制管理方法。但是怎么和 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 事务的默认提交方式 

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计4384字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)