2013-11-22 15:07:24.0|分类: activiti|浏览量: 2513
|
一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:
相信每个项目都有自己的事务控制管理方法。但是怎么和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);
}
}
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);
Connection connection = getConnection(); connection.commit();//提交JDBC事务 connection.setAutoCommit(true);// 恢复JDBC事务的默认提交方式
getConnection()这个方法获取的事上面开启事务的哪一个连接。
|
