久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

activiti事務和業務事務共同使用的方法

190次閱讀
沒有評論

共計 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字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 罗山县| 涟源市| 朔州市| 宁波市| 邓州市| 余庆县| 龙川县| 保山市| 江口县| 武城县| 长治市| 伽师县| 潼关县| 文登市| 扶风县| 东阳市| 苍梧县| 介休市| 象山县| 获嘉县| 抚州市| 卫辉市| 开封市| 荥阳市| 柳州市| 南溪县| 化州市| 深水埗区| 准格尔旗| 呼伦贝尔市| 平湖市| 乌拉特后旗| 方山县| 平乡县| 通化县| 荃湾区| 汶上县| 黄陵县| 盘锦市| 巴塘县| 本溪市|