activiti事务和自己业务事务共同的使用
来源:互联网 发布:ubuntu zip压缩命令 编辑:程序博客网 时间:2024/06/05 11:55
一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:
- 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
- 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
相信每个项目都有自己的事务控制管理方法。但是怎么和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事务的默认提交方式
getConnection()这个方法获取的事上面开启事务的哪一个连接。
- activiti事务和自己业务事务共同的使用
- Spring事务和Activiti事务
- 银行转账业务-使用事务
- mysql 游标与事务共同使用
- mysql 游标与事务共同使用
- SSH:使用事务和不使用事务的区别
- 事务和事务的隔离
- TransactionScope的使用--业务层使用多个方法实现回滚解决方案-业务层事务
- 在业务层中使用事务
- activiti和业务集成:使用aop
- Axon Framework管理复杂的业务事务
- activiti之节点监听器结合业务的使用(让业务和流程完全分离)
- SSM的事务的配置和使用
- MySQL的事务和Java中的使用
- mysql基础 事务的认识和使用
- Spring事务管理器的配置和使用
- c# 业务层事务
- SAP业务事务代码
- 解决QLabel显示图片扭曲的问题
- android中广播的使用(动态和静态注册)
- iOS代码强制退出程序
- JDBC编程之程序优化
- hdu 5643King's Game(约瑟夫游戏,递归)
- activiti事务和自己业务事务共同的使用
- 在不同的浏览器下FORM及它的小伙伴们默认样式的CSS属性值是不完全一致
- Java解析xml的主要解析器: SAX和DOM的选择
- linux系统设置程序开机启动(以mysql为例)
- bootstrap Model 点击确定按钮后 转到新页面
- 知乎 哪些素质很重要,却是读书学不来的?-3
- Android的源代码下载教程-android学习之旅(102)
- eclipse打jar包
- SVD(一)