예제 #1
0
    public override async ValueTask <TransactionBase> BeginTransactionAsync(TransactionParameterBuffer tpb, CancellationToken cancellationToken = default)
    {
        var transaction = new FesTransaction(this);
        await transaction.BeginTransactionAsync(tpb, cancellationToken).ConfigureAwait(false);

        return(transaction);
    }
        public override async Task <TransactionBase> BeginTransaction(TransactionParameterBuffer tpb, AsyncWrappingCommonArgs async)
        {
            var transaction = new FesTransaction(this);
            await transaction.BeginTransaction(tpb, async).ConfigureAwait(false);

            return(transaction);
        }
예제 #3
0
        public void BeginTransaction(TransactionParameterBuffer tpb)
        {
            lock (this.db)
            {
                if (this.state != TransactionState.NoTransaction)
                {
                    throw new IscException(
                              IscCodes.isc_arg_gds,
                              IscCodes.isc_tra_state,
                              this.handle,
                              "no valid");
                }

                this.state = TransactionState.TrasactionStarting;

                try
                {
                    this.db.Send.Write(IscCodes.op_transaction);
                    this.db.Send.Write(this.db.Handle);
                    this.db.Send.WriteBuffer(tpb.ToArray());
                    this.db.Send.Flush();

                    this.handle = db.ReadGenericResponse().ObjectHandle;
                    this.state  = TransactionState.TransactionStarted;

                    this.db.TransactionCount++;
                }
                catch (IOException)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }
예제 #4
0
        private TransactionParameterBuffer BuildTpb(IsolationLevel isolationLevel)
        {
            TransactionParameterBuffer tpb = this.db.CreateTransactionParameterBuffer();

            tpb.Append(IscCodes.isc_tpb_version3);
            tpb.Append(IscCodes.isc_tpb_write);
            tpb.Append(IscCodes.isc_tpb_wait);

            /* Isolation level */
            switch (isolationLevel)
            {
            case IsolationLevel.Serializable:
                tpb.Append(IscCodes.isc_tpb_consistency);
                break;

            case IsolationLevel.RepeatableRead:
                tpb.Append(IscCodes.isc_tpb_concurrency);
                break;

            case IsolationLevel.ReadUncommitted:
                tpb.Append(IscCodes.isc_tpb_read_committed);
                tpb.Append(IscCodes.isc_tpb_rec_version);
                break;

            case IsolationLevel.ReadCommitted:
            default:
                tpb.Append(IscCodes.isc_tpb_read_committed);
                tpb.Append(IscCodes.isc_tpb_no_rec_version);
                break;
            }

            return(tpb);
        }
예제 #5
0
        public override void BeginTransaction(TransactionParameterBuffer tpb)
        {
            if (_state != TransactionState.NoTransaction)
            {
                throw new InvalidOperationException();
            }

            IscTeb teb     = new IscTeb();
            IntPtr tebData = IntPtr.Zero;

            try
            {
                ClearStatusVector();

                teb.dbb_ptr = Marshal.AllocHGlobal(4);
                Marshal.WriteInt32(teb.dbb_ptr, _db.Handle);

                teb.tpb_len = tpb.Length;

                teb.tpb_ptr = Marshal.AllocHGlobal(tpb.Length);
                Marshal.Copy(tpb.ToArray(), 0, teb.tpb_ptr, tpb.Length);

                int size = Marshal2.SizeOf <IscTeb>();
                tebData = Marshal.AllocHGlobal(size);

                Marshal.StructureToPtr(teb, tebData, true);

                _db.FbClient.isc_start_multiple(
                    _statusVector,
                    ref _handle,
                    1,
                    tebData);

                _db.ProcessStatusVector(_statusVector);

                _state = TransactionState.Active;

                _db.TransactionCount++;
            }
            catch
            {
                throw;
            }
            finally
            {
                if (teb.dbb_ptr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(teb.dbb_ptr);
                }
                if (teb.tpb_ptr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(teb.tpb_ptr);
                }
                if (tebData != IntPtr.Zero)
                {
                    Marshal2.DestroyStructure <IscTeb>(tebData);
                    Marshal.FreeHGlobal(tebData);
                }
            }
        }
예제 #6
0
    public override TransactionBase BeginTransaction(TransactionParameterBuffer tpb)
    {
        var transaction = new FesTransaction(this);

        transaction.BeginTransaction(tpb);
        return(transaction);
    }
        public void BeginTransaction(TransactionParameterBuffer tpb)
        {
            if (this.state != TransactionState.NoTransaction)
            {
                throw new IscException(IscCodes.isc_arg_gds, IscCodes.isc_tra_state, this.handle, "no valid");
            }

            lock (this.database.SyncObject)
            {
                try
                {
                    this.database.Write(IscCodes.op_transaction);
                    this.database.Write(this.database.Handle);
                    this.database.WriteBuffer(tpb.ToArray());
                    this.database.Flush();

                    GenericResponse response = this.database.ReadGenericResponse();

                    this.handle = response.ObjectHandle;
                    this.state  = TransactionState.Active;

                    this.database.TransactionCount++;
                }
                catch (IOException)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }
예제 #8
0
        public void BeginTransaction(TransactionParameterBuffer tpb)
        {
            lock (stateSyncRoot)
            {
                if (this.state != TransactionState.NoTransaction)
                {
                    throw GetNoValidTransactionException();
                }

                try
                {
                    GenericResponse response;
                    lock (this.database.SyncObject)
                    {
                        this.database.Write(IscCodes.op_transaction);
                        this.database.Write(this.database.Handle);
                        this.database.WriteBuffer(tpb.ToArray());
                        this.database.Flush();

                        response = this.database.ReadGenericResponse();

                        this.database.TransactionCount++;
                    }

                    this.handle = response.ObjectHandle;
                    this.state  = TransactionState.Active;
                }
                catch (IOException)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }
예제 #9
0
        public override void BeginTransaction(TransactionParameterBuffer tpb)
        {
            if (_state != TransactionState.NoTransaction)
            {
                throw new InvalidOperationException();
            }

            try
            {
                _database.Xdr.Write(IscCodes.op_transaction);
                _database.Xdr.Write(_database.Handle);
                _database.Xdr.WriteBuffer(tpb.ToArray());
                _database.Xdr.Flush();

                var response = _database.ReadResponse <GenericResponse>();

                _database.TransactionCount++;

                _handle = response.ObjectHandle;
                _state  = TransactionState.Active;
            }
            catch (IOException ex)
            {
                throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
            }
        }
예제 #10
0
        public override async Task BeginTransaction(TransactionParameterBuffer tpb, AsyncWrappingCommonArgs async)
        {
            if (State != TransactionState.NoTransaction)
            {
                throw new InvalidOperationException();
            }

            try
            {
                await _database.Xdr.Write(IscCodes.op_transaction, async).ConfigureAwait(false);

                await _database.Xdr.Write(_database.Handle, async).ConfigureAwait(false);

                await _database.Xdr.WriteBuffer(tpb.ToArray(), async).ConfigureAwait(false);

                await _database.Xdr.Flush(async).ConfigureAwait(false);

                var response = (GenericResponse)await _database.ReadResponse(async).ConfigureAwait(false);

                _database.TransactionCount++;

                _handle = response.ObjectHandle;
                State   = TransactionState.Active;
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
예제 #11
0
        public override void BeginTransaction(TransactionParameterBuffer tpb)
        {
            lock (_stateSyncRoot)
            {
                if (_state != TransactionState.NoTransaction)
                {
                    throw new InvalidOperationException();
                }

                try
                {
                    GenericResponse response;
                    lock (_database.SyncObject)
                    {
                        _database.XdrStream.Write(IscCodes.op_transaction);
                        _database.XdrStream.Write(_database.Handle);
                        _database.XdrStream.WriteBuffer(tpb.ToArray());
                        _database.XdrStream.Flush();

                        response = _database.ReadGenericResponse();

                        _database.TransactionCount++;
                    }

                    _handle = response.ObjectHandle;
                    _state  = TransactionState.Active;
                }
                catch (IOException ex)
                {
                    throw IscException.ForErrorCode(IscCodes.isc_net_read_err, ex);
                }
            }
        }
예제 #12
0
    public override async ValueTask BeginTransactionAsync(TransactionParameterBuffer tpb, CancellationToken cancellationToken = default)
    {
        if (State != TransactionState.NoTransaction)
        {
            throw new InvalidOperationException();
        }

        try
        {
            await _database.Xdr.WriteAsync(IscCodes.op_transaction, cancellationToken).ConfigureAwait(false);

            await _database.Xdr.WriteAsync(_database.Handle, cancellationToken).ConfigureAwait(false);

            await _database.Xdr.WriteBufferAsync(tpb.ToArray(), cancellationToken).ConfigureAwait(false);

            await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

            var response = (GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);

            _database.TransactionCount++;

            _handle = response.ObjectHandle;
            State   = TransactionState.Active;
        }
        catch (IOException ex)
        {
            throw IscException.ForIOException(ex);
        }
    }
예제 #13
0
        public virtual TransactionBase BeginTransaction(TransactionParameterBuffer tpb)
        {
            var transaction = new GdsTransaction(this);

            transaction.BeginTransaction(tpb);

            return(transaction);
        }
예제 #14
0
        public TransactionBase BeginTransaction(TransactionParameterBuffer tpb)
        {
            FesTransaction transaction = new FesTransaction(this);

            transaction.BeginTransaction(tpb);

            return(transaction);
        }
예제 #15
0
        public ITransaction BeginTransaction(TransactionParameterBuffer tpb)
        {
            GdsTransaction transaction = new GdsTransaction(this);

            transaction.BeginTransaction(tpb);

            return(transaction);
        }
예제 #16
0
        public override ValueTask BeginTransactionAsync(TransactionParameterBuffer tpb, CancellationToken cancellationToken = default)
        {
            if (State != TransactionState.NoTransaction)
            {
                throw new InvalidOperationException();
            }

            var teb     = new IscTeb();
            var tebData = IntPtr.Zero;

            try
            {
                ClearStatusVector();

                teb.dbb_ptr = Marshal.AllocHGlobal(4);
                Marshal.WriteInt32(teb.dbb_ptr, _db.Handle);

                teb.tpb_len = tpb.Length;

                teb.tpb_ptr = Marshal.AllocHGlobal(tpb.Length);
                Marshal.Copy(tpb.ToArray(), 0, teb.tpb_ptr, tpb.Length);

                var size = Marshal.SizeOf <IscTeb>();
                tebData = Marshal.AllocHGlobal(size);

                Marshal.StructureToPtr(teb, tebData, true);

                _db.FbClient.isc_start_multiple(
                    _statusVector,
                    ref _handle,
                    1,
                    tebData);

                _db.ProcessStatusVector(_statusVector);

                State = TransactionState.Active;

                _db.TransactionCount++;
            }
            finally
            {
                if (teb.dbb_ptr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(teb.dbb_ptr);
                }
                if (teb.tpb_ptr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(teb.tpb_ptr);
                }
                if (tebData != IntPtr.Zero)
                {
                    Marshal.DestroyStructure <IscTeb>(tebData);
                    Marshal.FreeHGlobal(tebData);
                }
            }

            return(ValueTask2.CompletedTask);
        }
예제 #17
0
        public void BeginTransaction(TransactionParameterBuffer tpb)
        {
            // Clear the status vector
            this.ClearStatusVector();

            int trHandle = 0;

            lock (this.db)
            {
                SafeNativeMethods.isc_get_current_transaction(this.statusVector, ref trHandle);

                this.handle = trHandle;
                this.state  = TransactionState.Active;
            }
        }
예제 #18
0
        public override void BeginTransaction(TransactionParameterBuffer tpb)
        {
            if (_state != TransactionState.NoTransaction)
            {
                throw new InvalidOperationException();
            }

            lock (_db)
            {
                IscTeb teb     = new IscTeb();
                IntPtr tebData = IntPtr.Zero;

                try
                {
                    // Clear the status vector
                    ClearStatusVector();

                    // Set db handle
                    teb.dbb_ptr = Marshal.AllocHGlobal(4);
                    Marshal.WriteInt32(teb.dbb_ptr, _db.Handle);

                    // Set tpb length
                    teb.tpb_len = tpb.Length;

                    // Set TPB data
                    teb.tpb_ptr = Marshal.AllocHGlobal(tpb.Length);
                    Marshal.Copy(tpb.ToArray(), 0, teb.tpb_ptr, tpb.Length);

                    // Alloc memory	for	the	IscTeb structure
                    int size = Marshal.SizeOf(typeof(IscTeb));
                    tebData = Marshal.AllocHGlobal(size);

                    Marshal.StructureToPtr(teb, tebData, true);

                    _db.FbClient.isc_start_multiple(
                        _statusVector,
                        ref _handle,
                        1,
                        tebData);

                    // Parse status	vector
                    _db.ProcessStatusVector(_statusVector);

                    // Update transaction state
                    _state = TransactionState.Active;

                    // Update transaction count
                    _db.TransactionCount++;
                }
                catch
                {
                    throw;
                }
                finally
                {
                    // Free	memory
                    if (teb.dbb_ptr != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(teb.dbb_ptr);
                    }
                    if (teb.tpb_ptr != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(teb.tpb_ptr);
                    }
                    if (tebData != IntPtr.Zero)
                    {
                        Marshal.DestroyStructure(tebData, typeof(IscTeb));
                        Marshal.FreeHGlobal(tebData);
                    }
                }
            }
        }
예제 #19
0
        private TransactionParameterBuffer BuildTpb(FbTransactionOptions options)
        {
            TransactionParameterBuffer tpb = new TransactionParameterBuffer();

            tpb.Append(IscCodes.isc_tpb_version3);

            FbTransactionOptions[] o = (FbTransactionOptions[])Enum.GetValues(options.GetType());
            for (int i = 0; i < o.Length; i++)
            {
                FbTransactionOptions option = ((FbTransactionOptions)(o[i]));
                if ((options & option) == option)
                {
                    switch (option)
                    {
                    case FbTransactionOptions.Consistency:
                        tpb.Append(IscCodes.isc_tpb_consistency);
                        break;

                    case FbTransactionOptions.Concurrency:
                        tpb.Append(IscCodes.isc_tpb_concurrency);
                        break;

                    case FbTransactionOptions.Shared:
                        tpb.Append(IscCodes.isc_tpb_shared);
                        break;

                    case FbTransactionOptions.Protected:
                        tpb.Append(IscCodes.isc_tpb_protected);
                        break;

                    case FbTransactionOptions.Exclusive:
                        tpb.Append(IscCodes.isc_tpb_exclusive);
                        break;

                    case FbTransactionOptions.Wait:
                        tpb.Append(IscCodes.isc_tpb_wait);
                        break;

                    case FbTransactionOptions.NoWait:
                        tpb.Append(IscCodes.isc_tpb_nowait);
                        break;

                    case FbTransactionOptions.Read:
                        tpb.Append(IscCodes.isc_tpb_read);
                        break;

                    case FbTransactionOptions.Write:
                        tpb.Append(IscCodes.isc_tpb_write);
                        break;

                    case FbTransactionOptions.LockRead:
                        tpb.Append(IscCodes.isc_tpb_lock_read);
                        break;

                    case FbTransactionOptions.LockWrite:
                        tpb.Append(IscCodes.isc_tpb_lock_write);
                        break;

                    case FbTransactionOptions.ReadCommitted:
                        tpb.Append(IscCodes.isc_tpb_read_committed);
                        break;

                    case FbTransactionOptions.Autocommit:
                        tpb.Append(IscCodes.isc_tpb_autocommit);
                        break;

                    case FbTransactionOptions.RecVersion:
                        tpb.Append(IscCodes.isc_tpb_rec_version);
                        break;

                    case FbTransactionOptions.NoRecVersion:
                        tpb.Append(IscCodes.isc_tpb_no_rec_version);
                        break;

                    case FbTransactionOptions.RestartRequests:
                        tpb.Append(IscCodes.isc_tpb_restart_requests);
                        break;

                    case FbTransactionOptions.NoAutoUndo:
                        tpb.Append(IscCodes.isc_tpb_no_auto_undo);
                        break;
                    }
                }
            }

            return(tpb);
        }
예제 #20
0
        private TransactionParameterBuffer BuildTpb(FbTransactionOptions options)
        {
            TransactionParameterBuffer tpb = new TransactionParameterBuffer();

            tpb.Append(IscCodes.isc_tpb_version3);

            if ((options & FbTransactionOptions.Consistency) == FbTransactionOptions.Consistency)
            {
                tpb.Append(IscCodes.isc_tpb_consistency);
            }
            if ((options & FbTransactionOptions.Concurrency) == FbTransactionOptions.Concurrency)
            {
                tpb.Append(IscCodes.isc_tpb_concurrency);
            }
            if ((options & FbTransactionOptions.Shared) == FbTransactionOptions.Shared)
            {
                tpb.Append(IscCodes.isc_tpb_shared);
            }
            if ((options & FbTransactionOptions.Protected) == FbTransactionOptions.Protected)
            {
                tpb.Append(IscCodes.isc_tpb_protected);
            }
            if ((options & FbTransactionOptions.Exclusive) == FbTransactionOptions.Exclusive)
            {
                tpb.Append(IscCodes.isc_tpb_exclusive);
            }
            if ((options & FbTransactionOptions.Wait) == FbTransactionOptions.Wait)
            {
                tpb.Append(IscCodes.isc_tpb_wait);
            }
            if ((options & FbTransactionOptions.NoWait) == FbTransactionOptions.NoWait)
            {
                tpb.Append(IscCodes.isc_tpb_nowait);
            }
            if ((options & FbTransactionOptions.Read) == FbTransactionOptions.Read)
            {
                tpb.Append(IscCodes.isc_tpb_read);
            }
            if ((options & FbTransactionOptions.Write) == FbTransactionOptions.Write)
            {
                tpb.Append(IscCodes.isc_tpb_write);
            }
            if ((options & FbTransactionOptions.LockRead) == FbTransactionOptions.LockRead)
            {
                tpb.Append(IscCodes.isc_tpb_lock_read);
            }
            if ((options & FbTransactionOptions.LockWrite) == FbTransactionOptions.LockWrite)
            {
                tpb.Append(IscCodes.isc_tpb_lock_write);
            }
            if ((options & FbTransactionOptions.ReadCommitted) == FbTransactionOptions.ReadCommitted)
            {
                tpb.Append(IscCodes.isc_tpb_read_committed);
            }
            if ((options & FbTransactionOptions.Autocommit) == FbTransactionOptions.Autocommit)
            {
                tpb.Append(IscCodes.isc_tpb_autocommit);
            }
            if ((options & FbTransactionOptions.RecVersion) == FbTransactionOptions.RecVersion)
            {
                tpb.Append(IscCodes.isc_tpb_rec_version);
            }
            if ((options & FbTransactionOptions.NoRecVersion) == FbTransactionOptions.NoRecVersion)
            {
                tpb.Append(IscCodes.isc_tpb_no_rec_version);
            }
            if ((options & FbTransactionOptions.RestartRequests) == FbTransactionOptions.RestartRequests)
            {
                tpb.Append(IscCodes.isc_tpb_restart_requests);
            }
            if ((options & FbTransactionOptions.NoAutoUndo) == FbTransactionOptions.NoAutoUndo)
            {
                tpb.Append(IscCodes.isc_tpb_no_auto_undo);
            }

            return(tpb);
        }
예제 #21
0
 public abstract TransactionBase BeginTransaction(TransactionParameterBuffer tpb);
예제 #22
0
        public void BeginTransaction(TransactionParameterBuffer tpb)
        {
            if (this.state != TransactionState.NoTransaction)
            {
                throw new IscException(IscCodes.isc_arg_gds, IscCodes.isc_tra_state, this.handle, "no valid");
            }

            lock (this.db)
            {
                IscTeb teb     = new IscTeb();
                IntPtr tebData = IntPtr.Zero;

                try
                {
                    // Clear the status vector
                    this.ClearStatusVector();

                    // Set db handle
                    teb.dbb_ptr = Marshal.AllocHGlobal(4);
                    Marshal.WriteInt32(teb.dbb_ptr, this.db.Handle);

                    // Set tpb length
                    teb.tpb_len = tpb.Length;

                    // Set TPB data
                    teb.tpb_ptr = Marshal.AllocHGlobal(tpb.Length);
                    Marshal.Copy(tpb.ToArray(), 0, teb.tpb_ptr, tpb.Length);

                    // Alloc memory	for	the	IscTeb structure
                    int size = Marshal.SizeOf(typeof(IscTeb));
                    tebData = Marshal.AllocHGlobal(size);

                    Marshal.StructureToPtr(teb, tebData, true);

                    int trHandle = this.handle;

                    db.FbClient.isc_start_multiple(
                        this.statusVector,
                        ref trHandle,
                        1,
                        tebData);

                    this.handle = trHandle;

                    // Parse status	vector
                    this.db.ParseStatusVector(this.statusVector);

                    // Update transaction state
                    this.state = TransactionState.Active;

                    // Update transaction count
                    this.db.TransactionCount++;
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    // Free	memory
                    if (teb.dbb_ptr != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(teb.dbb_ptr);
                    }
                    if (teb.tpb_ptr != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(teb.tpb_ptr);
                    }
                    if (tebData != IntPtr.Zero)
                    {
                        Marshal.DestroyStructure(tebData, typeof(IscTeb));
                        Marshal.FreeHGlobal(tebData);
                    }
                }
            }
        }
예제 #23
0
        private static TransactionParameterBuffer BuildTpb(FbTransactionOptions options)
        {
            var tpb = new TransactionParameterBuffer();

            tpb.Append(IscCodes.isc_tpb_version3);

            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.Consistency))
            {
                tpb.Append(IscCodes.isc_tpb_consistency);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.Concurrency))
            {
                tpb.Append(IscCodes.isc_tpb_concurrency);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.Wait))
            {
                tpb.Append(IscCodes.isc_tpb_wait);
                if (options.WaitTimeoutTPBValue.HasValue)
                {
                    tpb.Append(IscCodes.isc_tpb_lock_timeout, (short)options.WaitTimeoutTPBValue);
                }
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.NoWait))
            {
                tpb.Append(IscCodes.isc_tpb_nowait);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.Read))
            {
                tpb.Append(IscCodes.isc_tpb_read);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.Write))
            {
                tpb.Append(IscCodes.isc_tpb_write);
            }
            foreach (var table in options.LockTables)
            {
                int lockType;
                if (table.Value.HasFlag(FbTransactionBehavior.LockRead))
                {
                    lockType = IscCodes.isc_tpb_lock_read;
                }
                else if (table.Value.HasFlag(FbTransactionBehavior.LockWrite))
                {
                    lockType = IscCodes.isc_tpb_lock_write;
                }
                else
                {
                    throw new ArgumentException("Must specify either LockRead or LockWrite.");
                }
                tpb.Append(lockType, table.Key);

                int?lockBehavior = null;
                if (table.Value.HasFlag(FbTransactionBehavior.Exclusive))
                {
                    lockBehavior = IscCodes.isc_tpb_exclusive;
                }
                else if (table.Value.HasFlag(FbTransactionBehavior.Protected))
                {
                    lockBehavior = IscCodes.isc_tpb_protected;
                }
                else if (table.Value.HasFlag(FbTransactionBehavior.Shared))
                {
                    lockBehavior = IscCodes.isc_tpb_shared;
                }
                if (lockBehavior.HasValue)
                {
                    tpb.Append((int)lockBehavior);
                }
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.ReadCommitted))
            {
                tpb.Append(IscCodes.isc_tpb_read_committed);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.Autocommit))
            {
                tpb.Append(IscCodes.isc_tpb_autocommit);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.RecVersion))
            {
                tpb.Append(IscCodes.isc_tpb_rec_version);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.NoRecVersion))
            {
                tpb.Append(IscCodes.isc_tpb_no_rec_version);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.RestartRequests))
            {
                tpb.Append(IscCodes.isc_tpb_restart_requests);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.NoAutoUndo))
            {
                tpb.Append(IscCodes.isc_tpb_no_auto_undo);
            }
            if (options.TransactionBehavior.HasFlag(FbTransactionBehavior.ReadConsistency))
            {
                tpb.Append(IscCodes.isc_tpb_read_consistency);
            }

            return(tpb);
        }
 public abstract void BeginTransaction(TransactionParameterBuffer tpb);
 public abstract ValueTask BeginTransactionAsync(TransactionParameterBuffer tpb, CancellationToken cancellationToken = default);