diff options
author | sqweek <sqweek@gmail.com> | 2016-04-18 19:49:17 +0800 |
---|---|---|
committer | sqweek <sqweek@gmail.com> | 2016-04-18 21:47:24 +0800 |
commit | 727ad200a2f6cdd698bb0e3253f51d36d269bb9e (patch) | |
tree | 5e90a2f806336d5874092844e3f2d30969800b3b | |
parent | Merge pull request #298 from shaxbee/master (diff) | |
download | golite-727ad200a2f6cdd698bb0e3253f51d36d269bb9e.tar.gz golite-727ad200a2f6cdd698bb0e3253f51d36d269bb9e.tar.xz |
Fix inconsistent tx state with database/sql.
The semantics of sql.Tx.Commit impose that the transaction is
finished and cleaned up by the time the driver's Commit function
returns. However sqlite3 leaves the transaction open if COMMIT
fails due to an SQLITE_BUSY error, so *we* must clean it up.
Closes #184.
-rw-r--r-- | sqlite3.go | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -292,6 +292,12 @@ func (ai *aggInfo) Done(ctx *C.sqlite3_context) { // Commit transaction. func (tx *SQLiteTx) Commit() error { _, err := tx.c.exec("COMMIT") + if err != nil && err.(Error).Code == C.SQLITE_BUSY { + // sqlite3 will leave the transaction open in this scenario. + // However, database/sql considers the transaction complete once we + // return from Commit() - we must clean up to honour its semantics. + tx.c.exec("ROLLBACK") + } return err } |