diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2015-05-21 09:53:52 -0600 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2015-05-21 09:53:52 -0600 |
commit | afceb316b96ea97cbac6d23afbdf69543d80748a (patch) | |
tree | 131831c69b1490356cb829c60829392410c860a1 | |
parent | Merge pull request #377 from benbjohnson/close-race (diff) | |
parent | Add docs for dependent transactions. (diff) | |
download | dedo-afceb316b96ea97cbac6d23afbdf69543d80748a.tar.gz dedo-afceb316b96ea97cbac6d23afbdf69543d80748a.tar.xz |
Merge pull request #379 from benbjohnson/tx-doc
Add docs for dependent transactions.
-rw-r--r-- | README.md | 5 | ||||
-rw-r--r-- | db.go | 5 |
2 files changed, 10 insertions, 0 deletions
@@ -87,6 +87,11 @@ are not thread safe. To work with data in multiple goroutines you must start a transaction for each one or use locking to ensure only one goroutine accesses a transaction at a time. Creating transaction from the `DB` is thread safe. +Read-only transactions and read-write transactions should not depend on one +another and generally shouldn't be opened simultaneously in the same goroutine. +This can cause a deadlock as the read-write transaction needs to periodically +re-map the data file but it cannot do so while a read-only transaction is open. + #### Read-write transactions @@ -401,6 +401,11 @@ func (db *DB) close() error { // will cause the calls to block and be serialized until the current write // transaction finishes. // +// Transactions should not be depedent on one another. Opening a read +// transaction and a write transaction in the same goroutine can cause the +// writer to deadlock because the database periodically needs to re-mmap itself +// as it grows and it cannot do that while a read transaction is open. +// // IMPORTANT: You must close read-only transactions after you are finished or // else the database will not reclaim old pages. func (db *DB) Begin(writable bool) (*Tx, error) { |