/// <summary> /// Manual distributed transaction enlistment support /// </summary> /// <param name="transaction">The distributed transaction to enlist in</param> public override void EnlistTransaction(Portable.Transactions.Transaction transaction) { if (_transactionLevel > 0 && transaction != null) throw new ArgumentException("Unable to enlist in transaction, a local transaction already exists"); if (_enlistment != null && transaction != _enlistment._scope) throw new ArgumentException("Already enlisted in a transaction"); _enlistment = new SqliteEnlistment(this, transaction); }
/// <summary> /// When the database connection is closed, all commands linked to this connection are automatically reset. /// </summary> public override void Close() { if (_sql != null) { if (_enlistment != null) { // If the connection is enlisted in a transaction scope and the scope is still active, // we cannot truly shut down this connection until the scope has completed. Therefore make a // hidden connection temporarily to hold open the connection until the scope has completed. var cnn = new SqliteAdoConnection(_sqliteDbConnection, _cryptEngine) { _sql = this._sql, _transactionLevel = this._transactionLevel, _enlistment = this._enlistment, _connectionState = this._connectionState, _version = this._version }; cnn._enlistment._transaction._cnn = cnn; cnn._enlistment._disposeConnection = true; _sql = null; _enlistment = null; } if (_sql != null) { _sql.Dispose(); //_sql.Close(); } _sql = null; _transactionLevel = 0; } OnStateChange(ConnectionState.Closed); }