Ignore multiple transaction commit/rollback/close.

This commit is contained in:
Ben Johnson 2014-03-01 12:53:05 -07:00
parent 7214e089c0
commit 3a1b152562
3 changed files with 16 additions and 5 deletions

2
db.go
View File

@ -571,7 +571,7 @@ func (db *DB) Stat() (*Stat, error) {
// page retrieves a page reference from the mmap based on the current page size.
func (db *DB) page(id pgid) *page {
pos := id*pgid(db.pageSize)
pos := id * pgid(db.pageSize)
return (*page)(unsafe.Pointer(&db.data[pos]))
}

View File

@ -82,6 +82,10 @@ func (t *RWTransaction) DeleteBucket(name string) error {
// Commit writes all changes to disk and updates the meta page.
// Returns an error if a disk write error occurs.
func (t *RWTransaction) Commit() error {
if t.db == nil {
return nil
}
defer t.close()
// TODO(benbjohnson): Use vectorized I/O to write out dirty pages.
@ -119,7 +123,10 @@ func (t *RWTransaction) Rollback() {
}
func (t *RWTransaction) close() {
t.db.rwlock.Unlock()
if t.db != nil {
t.db.rwlock.Unlock()
t.db = nil
}
}
// allocate returns a contiguous block of memory starting at a given page.

View File

@ -40,10 +40,14 @@ func (t *Transaction) id() txnid {
// Close closes the transaction and releases any pages it is using.
func (t *Transaction) Close() {
if t.rwtransaction != nil {
t.rwtransaction.Rollback()
if t.db != nil {
if t.rwtransaction != nil {
t.rwtransaction.Rollback()
} else {
t.db.removeTransaction(t)
t.db = nil
}
}
t.db.removeTransaction(t)
}
// DB returns a reference to the database that created the transaction.