/* * Copyright 2008-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.hasor.data.transaction.support; import net.hasor.data.datasource.SavepointManager; import net.hasor.data.transaction.Isolation; import net.hasor.data.transaction.Propagation; import net.hasor.data.transaction.TransactionStatus; import java.sql.SQLException; import java.sql.Savepoint; /** * 表示一个用于管理事务的状态点 * @version : 2013-10-30 * @author 赵永春(zyc@hasor.net) */ public class JdbcTransactionStatus implements TransactionStatus { private Savepoint savepoint = null; //事务保存点 private TransactionObject tranConn = null; //当前事务使用的数据库连接 private TransactionObject suspendConn = null; //当前事务之前挂起的上一个数据库事务 private Propagation behavior = null; //传播属性 private Isolation level = null; //隔离级别 private boolean completed = false; //完成(true表示完成) private boolean rollbackOnly = false; //要求回滚(true表示回滚) private boolean newConnection = false; //是否使用了一个全新的数据库连接开启事务(true表示新连接) private boolean readOnly = false; //只读模式(true表示只读) // public JdbcTransactionStatus(final Propagation behavior, final Isolation level) { this.behavior = behavior; this.level = level; } // // // private SavepointManager getSavepointManager() { return this.tranConn.getSavepointManager(); } public void markHeldSavepoint() throws SQLException { if (this.hasSavepoint()) { throw new SQLException("TransactionStatus has Savepoint"); } if (!this.getSavepointManager().supportSavepoint()) { throw new SQLException("SavepointManager does not support Savepoint."); } // this.savepoint = this.getSavepointManager().createSavepoint(); } public void releaseHeldSavepoint() throws SQLException { if (!this.hasSavepoint()) { throw new SQLException("TransactionStatus has not Savepoint"); } if (!this.getSavepointManager().supportSavepoint()) { throw new SQLException("SavepointManager does not support Savepoint."); } // this.getSavepointManager().releaseSavepoint(this.savepoint); } public void rollbackToHeldSavepoint() throws SQLException { if (!this.hasSavepoint()) { throw new SQLException("TransactionStatus has not Savepoint"); } if (!this.getSavepointManager().supportSavepoint()) { throw new SQLException("SavepointManager does not support Savepoint."); } // this.getSavepointManager().rollbackToSavepoint(this.savepoint); } /*设置完成状态*/ void setCompleted() { this.completed = true; } /*标记使用的是全新连接*/ void markNewConnection() { this.newConnection = true; } TransactionObject getTranConn() { return this.tranConn; } void setTranConn(final TransactionObject tranConn) { this.tranConn = tranConn; } TransactionObject getSuspendConn() { return this.suspendConn; } void setSuspendConn(final TransactionObject suspendConn) { this.suspendConn = suspendConn; } // // // @Override public Propagation getTransactionBehavior() { return this.behavior; } @Override public Isolation getIsolationLevel() { return this.level; } @Override public boolean isCompleted() { return this.completed; } @Override public boolean isRollbackOnly() { return this.rollbackOnly; } @Override public boolean isReadOnly() { return this.readOnly; } @Override public boolean isNewConnection() { return this.newConnection; } @Override public boolean isSuspend() { return this.suspendConn != null; } @Override public boolean hasSavepoint() { return this.savepoint != null; } @Override public void setRollbackOnly() throws SQLException { if (this.isCompleted()) { throw new SQLException("Transaction is already completed."); } this.rollbackOnly = true; } @Override public void setReadOnly() throws SQLException { if (this.isCompleted()) { throw new SQLException("Transaction is already completed."); } this.readOnly = true; } }