database: convert Tx.done to atomic type

Change-Id: I9ec725009376f5865adedca6c159b14140dde097
Reviewed-on: https://go-review.googlesource.com/c/go/+/426086
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Daniel Theophanes <kardianos@gmail.com>
Run-TryBot: Daniel Theophanes <kardianos@gmail.com>
This commit is contained in:
cuiweixie 2022-08-27 11:38:32 +08:00 committed by Daniel Theophanes
parent d61ffe8b6c
commit 0e50bf0e40

View File

@ -2136,11 +2136,10 @@ type Tx struct {
// any held driverConn back to the pool. // any held driverConn back to the pool.
releaseConn func(error) releaseConn func(error)
// done transitions from 0 to 1 exactly once, on Commit // done transitions from false to true exactly once, on Commit
// or Rollback. once done, all operations fail with // or Rollback. once done, all operations fail with
// ErrTxDone. // ErrTxDone.
// Use atomic operations on value when checking value. done atomic.Bool
done int32
// keepConnOnRollback is true if the driver knows // keepConnOnRollback is true if the driver knows
// how to reset the connection's session and if need be discard // how to reset the connection's session and if need be discard
@ -2179,7 +2178,7 @@ func (tx *Tx) awaitDone() {
} }
func (tx *Tx) isDone() bool { func (tx *Tx) isDone() bool {
return atomic.LoadInt32(&tx.done) != 0 return tx.done.Load()
} }
// ErrTxDone is returned by any operation that is performed on a transaction // ErrTxDone is returned by any operation that is performed on a transaction
@ -2248,12 +2247,12 @@ func (tx *Tx) Commit() error {
select { select {
default: default:
case <-tx.ctx.Done(): case <-tx.ctx.Done():
if atomic.LoadInt32(&tx.done) == 1 { if tx.done.Load() {
return ErrTxDone return ErrTxDone
} }
return tx.ctx.Err() return tx.ctx.Err()
} }
if !atomic.CompareAndSwapInt32(&tx.done, 0, 1) { if !tx.done.CompareAndSwap(false, true) {
return ErrTxDone return ErrTxDone
} }
@ -2281,7 +2280,7 @@ var rollbackHook func()
// rollback aborts the transaction and optionally forces the pool to discard // rollback aborts the transaction and optionally forces the pool to discard
// the connection. // the connection.
func (tx *Tx) rollback(discardConn bool) error { func (tx *Tx) rollback(discardConn bool) error {
if !atomic.CompareAndSwapInt32(&tx.done, 0, 1) { if !tx.done.CompareAndSwap(false, true) {
return ErrTxDone return ErrTxDone
} }