您好,登錄后才能下訂單哦!
今天小編給大家分享一下activiti事務(wù)和業(yè)務(wù)事務(wù)共同使用的方法的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
一個(gè)數(shù)據(jù)庫事務(wù)通常包含了一個(gè)序列的對數(shù)據(jù)庫的讀/寫操作。它的存在包含有以下兩個(gè)目的:
為數(shù)據(jù)庫操作序列提供了一個(gè)從失敗中恢復(fù)到正常狀態(tài)的方法,同時(shí)提供了數(shù)據(jù)庫即使在異常狀態(tài)下仍能保持一致性的方法。
當(dāng)多個(gè)應(yīng)用程序在并發(fā)訪問數(shù)據(jù)庫時(shí),可以在這些應(yīng)用程序之間提供一個(gè)隔離方法,以防止彼此的操作互相干擾。
相信每個(gè)項(xiàng)目都有自己的事務(wù)控制管理方法。但是怎么和activiti的事務(wù)相結(jié)合使用呢?
activiti基于spring的事務(wù)集成網(wǎng)上的資料很多。這里省略1000字。
但是,有的項(xiàng)目并沒有使用spring,那怎么控制事務(wù)呢?
1、創(chuàng)建activiti的配置信息:
StandaloneProcessEngineConfiguration conf = (StandaloneProcessEngineConfiguration) ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration();
2、設(shè)置activiti配置信息(比如是否自動(dòng)更新,是否使用歷史,字體...):
conf.setDatabaseSchemaUpdate("true"); conf.setDbHistoryUsed(true); conf.setHistory("full"); conf.setActivityFontName("宋體"); conf.setJobExecutorActivate(false);
3、設(shè)置數(shù)據(jù)庫的DataSource
conf.setDataSource(DBManager.getDataSource());
請注意:這個(gè)DBManager.getDataSource()是自己封裝的代碼。
4、設(shè)置事務(wù)管理工廠(CustomJdbcTransactionFactory這個(gè)方法時(shí)我自己寫的,下面會(huì)詳細(xì)介紹):
CustomJdbcTransactionFactory jdbcTransactionFactory= new CustomJdbcTransactionFactory(); conf.setTransactionFactory(jdbcTransactionFactory);
重點(diǎn)就是在這了。
自己的事務(wù)會(huì)開啟一個(gè)數(shù)據(jù)庫連接Connection conn = dataSource.getConnection(),自己的所有操作都會(huì)在這個(gè)連接中完成。activiti的操作數(shù)據(jù)的時(shí)候也會(huì)打開一個(gè)連接dataSource.getConnection(),操作自己的數(shù)據(jù)。那就會(huì)出現(xiàn)問題,不在同一個(gè)連接中,何談事務(wù)?。?/p>
StandaloneProcessEngineConfiguration 中有個(gè)變量事務(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ù)打開的那個(gè)連接。
連接關(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共用了同一個(gè)事務(wù),如果拋出異常,就會(huì)回滾回去了。
這里簡單說一個(gè),QueryHelper.startTransaction()主要做的事情:
Connection conn = dataSource.getConnection(); conn.setAutoCommit(false);
QueryHelper.endTransaction()主要做的事情是:
Connection connection = getConnection(); connection.commit();//提交JDBC事務(wù) connection.setAutoCommit(true);// 恢復(fù)JDBC事務(wù)的默認(rèn)提交方式
以上就是“activiti事務(wù)和業(yè)務(wù)事務(wù)共同使用的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。