一 基于JDBC的事务
针对的是一个JDBC连接实现,不能跨多个数据库连接。如两个操作分别由两个不同的Connection执行,则不能实现
事例:
public static void main(String[] args) throws SQLException, IOException { // TODO Auto-generated method stub Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml"); SqlMapClient sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader); try{ sqlMapClient.startTransaction(); User user = (User) sqlMapClient.queryForObject("getUser", "test"); System.out.println("id=" + user.getId()); sqlMapClient.commitTransaction(); }finally{ //如果出现异常或没有提交,会进行roll back sqlMapClient.endTransaction(); } }
内部实现原理
MappedStatement ms = getMappedStatement(id); Transaction trans = getTransaction(sessionScope); boolean autoStart = trans == null; //调用sqlMapClient.startTransaction();后,会生成一个Transaction ,autoStart为false,不自动提交 try { trans = autoStartTransaction(sessionScope, autoStart, trans); StatementScope statementScope = beginStatementScope(sessionScope, ms); try { object = ms.executeQueryForObject(statementScope, trans, paramObject, resultObject); } finally { endStatementScope(statementScope); } autoCommitTransaction(sessionScope, autoStart); } finally { autoEndTransaction(sessionScope, autoStart); }
//sqlMapClient.commitTransaction();对应实现
public void commit(SessionScope sessionScope) throws SQLException, TransactionException { Transaction trans = sessionScope.getTransaction(); TransactionState state = sessionScope.getTransactionState(); if (state == TransactionState.STATE_USER_PROVIDED) { throw new TransactionException("TransactionManager could not commit. " + "A user provided connection is currently being used by this session. " + "You must call the commit() method of the Connection directly. " + "The calling .setUserConnection (null) will clear the user provided transaction."); } else if (state != TransactionState.STATE_STARTED && state != TransactionState.STATE_COMMITTED ) { throw new TransactionException("TransactionManager could not commit. No transaction is started."); } if (sessionScope.isCommitRequired() || config.isForceCommit()) { trans.commit();//提交事务 sessionScope.setCommitRequired(false); } sessionScope.setTransactionState(TransactionState.STATE_COMMITTED); }
// sqlMapClient.endTransaction(); 对应实现
if (trans != null) { try { if (state != TransactionState.STATE_COMMITTED) {//如果异常、或没提交 都会进行回滚 if (sessionScope.isCommitRequired() || config.isForceCommit()) { trans.rollback(); sessionScope.setCommitRequired(false); } } } finally { sessionScope.closePreparedStatements(); trans.close(); } }
二、基于JTA的事务
JTA提供了跨数据库连接(或其他JTA资源)的事务管理能力。这一点是与JDBC Transaction最大的差异。
后续。。。
来源:https://www.cnblogs.com/xuruhong/p/3271735.html