fix(nested transaction): SavePoint SQL Statement not support in Prepared Statements
1. SavetPoint SQL Statement not support in Prepared Statements e.g. see mysql8.0 doc: https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html Change-Id: I082012db9b140e8ec69764c633724665cc802692 Signed-off-by: 王柳洋 <wangliuyang.520@bytedance.com>
This commit is contained in:
parent
e9a1443475
commit
7bd0e7054c
@ -636,7 +636,6 @@ func (db *DB) Transaction(fc func(tx *DB) error, opts ...*sql.TxOptions) (err er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
// Make sure to rollback when panic, Block error or Commit error
|
// Make sure to rollback when panic, Block error or Commit error
|
||||||
if panicked || err != nil {
|
if panicked || err != nil {
|
||||||
@ -721,7 +720,21 @@ func (db *DB) Rollback() *DB {
|
|||||||
|
|
||||||
func (db *DB) SavePoint(name string) *DB {
|
func (db *DB) SavePoint(name string) *DB {
|
||||||
if savePointer, ok := db.Dialector.(SavePointerDialectorInterface); ok {
|
if savePointer, ok := db.Dialector.(SavePointerDialectorInterface); ok {
|
||||||
|
// close prepared statement, because SavePoint not support prepared statement.
|
||||||
|
// e.g. mysql8.0 doc: https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
|
||||||
|
var (
|
||||||
|
preparedStmtTx *PreparedStmtTX
|
||||||
|
isPreparedStmtTx bool
|
||||||
|
)
|
||||||
|
// close prepared statement, because SavePoint not support prepared statement.
|
||||||
|
if preparedStmtTx, isPreparedStmtTx = db.Statement.ConnPool.(*PreparedStmtTX); isPreparedStmtTx {
|
||||||
|
db.Statement.ConnPool = preparedStmtTx.Tx
|
||||||
|
}
|
||||||
db.AddError(savePointer.SavePoint(db, name))
|
db.AddError(savePointer.SavePoint(db, name))
|
||||||
|
// restore prepared statement
|
||||||
|
if isPreparedStmtTx {
|
||||||
|
db.Statement.ConnPool = preparedStmtTx
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
db.AddError(ErrUnsupportedDriver)
|
db.AddError(ErrUnsupportedDriver)
|
||||||
}
|
}
|
||||||
@ -730,7 +743,21 @@ func (db *DB) SavePoint(name string) *DB {
|
|||||||
|
|
||||||
func (db *DB) RollbackTo(name string) *DB {
|
func (db *DB) RollbackTo(name string) *DB {
|
||||||
if savePointer, ok := db.Dialector.(SavePointerDialectorInterface); ok {
|
if savePointer, ok := db.Dialector.(SavePointerDialectorInterface); ok {
|
||||||
|
// close prepared statement, because RollbackTo not support prepared statement.
|
||||||
|
// e.g. mysql8.0 doc: https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
|
||||||
|
var (
|
||||||
|
preparedStmtTx *PreparedStmtTX
|
||||||
|
isPreparedStmtTx bool
|
||||||
|
)
|
||||||
|
// close prepared statement, because SavePoint not support prepared statement.
|
||||||
|
if preparedStmtTx, isPreparedStmtTx = db.Statement.ConnPool.(*PreparedStmtTX); isPreparedStmtTx {
|
||||||
|
db.Statement.ConnPool = preparedStmtTx.Tx
|
||||||
|
}
|
||||||
db.AddError(savePointer.RollbackTo(db, name))
|
db.AddError(savePointer.RollbackTo(db, name))
|
||||||
|
// restore prepared statement
|
||||||
|
if isPreparedStmtTx {
|
||||||
|
db.Statement.ConnPool = preparedStmtTx
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
db.AddError(ErrUnsupportedDriver)
|
db.AddError(ErrUnsupportedDriver)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user