博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
activiti事务和自己业务事务共同的使用
阅读量:2385 次
发布时间:2019-05-10

本文共 4476 字,大约阅读时间需要 14 分钟。

本人博客开始迁移,博客整个架构自己搭建及编码  

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

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

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

相信每个项目都有自己的事务控制管理方法。但是怎么和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()这个方法获取的事上面开启事务的哪一个连接。

转载于:https://my.oschina.net/winHerson/blog/178302

你可能感兴趣的文章
hack tools
查看>>
rhel5中管理swap空间
查看>>
/proc filesystem allows bypassing directory permissions on Linux
查看>>
nginx dos
查看>>
RASP解决方案包括开源方案
查看>>
Linux下共享文件系统文件传输的简单设计(转载)
查看>>
点评Ubuntu下的文件安全删除工具
查看>>
数据可视化
查看>>
Security Ressources Sites
查看>>
mysql的比较运算
查看>>
Data Breach Report
查看>>
再探偏移注射
查看>>
DNS Security Tips
查看>>
符号执行
查看>>
Remote Installation Service (RIS) in Windows Server 2003
查看>>
Layer Four Traceroute
查看>>
Hardening guide for Apache 2.2.15 on RedHat 5.4 (64bit edition)
查看>>
Microsoft Outlook Web Access (OWA) version 8.2.254.0 information disclosure vulnerability
查看>>
STP mitm attack idea
查看>>
Month of PHP Security - Summary
查看>>