mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
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:
parent
d61ffe8b6c
commit
0e50bf0e40
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user