aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsqweek <sqweek@gmail.com>2016-04-18 19:49:17 +0800
committersqweek <sqweek@gmail.com>2016-04-18 21:47:24 +0800
commit727ad200a2f6cdd698bb0e3253f51d36d269bb9e (patch)
tree5e90a2f806336d5874092844e3f2d30969800b3b
parentMerge pull request #298 from shaxbee/master (diff)
downloadgolite-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.go6
1 files changed, 6 insertions, 0 deletions
diff --git a/sqlite3.go b/sqlite3.go
index 4d81917..86f686c 100644
--- a/sqlite3.go
+++ b/sqlite3.go
@@ -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
}