activiti事務(wù)和業(yè)務(wù)事務(wù)共同使用的方法

今天小編給大家分享一下activiti事務(wù)和業(yè)務(wù)事務(wù)共同使用的方法的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)提供從項目策劃、軟件開發(fā),軟件安全維護、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評估等整套的建站服務(wù),主營業(yè)務(wù)為成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),成都APP應(yīng)用開發(fā)以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。創(chuàng)新互聯(lián)深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

一個數(shù)據(jù)庫事務(wù)通常包含了一個序列的對數(shù)據(jù)庫的讀/寫操作。它的存在包含有以下兩個目的:

  1. 為數(shù)據(jù)庫操作序列提供了一個從失敗中恢復(fù)到正常狀態(tài)的方法,同時提供了數(shù)據(jù)庫即使在異常狀態(tài)下仍能保持一致性的方法。

  2. 當(dāng)多個應(yīng)用程序在并發(fā)訪問數(shù)據(jù)庫時,可以在這些應(yīng)用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。

相信每個項目都有自己的事務(wù)控制管理方法。但是怎么和activiti的事務(wù)相結(jié)合使用呢?

activiti基于spring的事務(wù)集成網(wǎng)上的資料很多。這里省略1000字。

但是,有的項目并沒有使用spring,那怎么控制事務(wù)呢?

1、創(chuàng)建activiti的配置信息:

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

2、設(shè)置activiti配置信息(比如是否自動更新,是否使用歷史,字體...):

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

3、設(shè)置數(shù)據(jù)庫的DataSource

conf.setDataSource(DBManager.getDataSource());

請注意:這個DBManager.getDataSource()是自己封裝的代碼。

4、設(shè)置事務(wù)管理工廠(CustomJdbcTransactionFactory這個方法時我自己寫的,下面會詳細介紹):

CustomJdbcTransactionFactory jdbcTransactionFactory=
					new CustomJdbcTransactionFactory();
			conf.setTransactionFactory(jdbcTransactionFactory);

重點就是在這了。

自己的事務(wù)會開啟一個數(shù)據(jù)庫連接Connection conn  = dataSource.getConnection(),自己的所有操作都會在這個連接中完成。activiti的操作數(shù)據(jù)的時候也會打開一個連接dataSource.getConnection(),操作自己的數(shù)據(jù)。那就會出現(xiàn)問題,不在同一個連接中,何談事務(wù)?。?/p>

StandaloneProcessEngineConfiguration 中有個變量事務(wù)管理器。

我們可以重寫事務(wù)管理器里面打開連接的方法,然后再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()方法,獲取數(shù)據(jù)庫連接是我業(yè)務(wù)打開的那個連接。

連接關(guān)閉close(),提交commit(),回滾rollback() ,全部注銷了。對數(shù)據(jù)庫連接的操作都有我業(yè)務(wù)來控制,不讓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就是創(chuàng)建工廠。很好理解。 5、創(chuàng)建引擎:

processEngine = conf.buildProcessEngine();

6、使用例子:

QueryHelper.startTransaction();//開啟事務(wù)
			
			taskService.claim(taskId, getPhoneId());
			taskService.complete(taskId, variables);
			。。。。。//自己的業(yè)務(wù)代碼
			QueryHelper.endTransaction();//關(guān)閉事務(wù)

自己業(yè)務(wù)和activiti共用了同一個事務(wù),如果拋出異常,就會回滾回去了。

這里簡單說一個,QueryHelper.startTransaction()主要做的事情:

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

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

Connection connection = getConnection();
			connection.commit();//提交JDBC事務(wù)   
			connection.setAutoCommit(true);// 恢復(fù)JDBC事務(wù)的默認提交方式

以上就是“activiti事務(wù)和業(yè)務(wù)事務(wù)共同使用的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章名稱:activiti事務(wù)和業(yè)務(wù)事務(wù)共同使用的方法
網(wǎng)頁路徑:http://www.muchs.cn/article26/ijsgjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站制作靜態(tài)網(wǎng)站、企業(yè)建站網(wǎng)頁設(shè)計公司、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)