diff --git a/lib/pstore.rb b/lib/pstore.rb index 429d7e5..e985418 100644 --- a/lib/pstore.rb +++ b/lib/pstore.rb @@ -312,8 +312,16 @@ class PStore # def transaction(read_only = false, &block) # :yields: pstore value = nil - raise PStore::Error, "nested transaction" if !@thread_safe && @lock.locked? - @lock.synchronize do + if !@thread_safe + raise PStore::Error, "nested transaction" unless @lock.try_lock + else + begin + @lock.lock + rescue ThreadError + raise PStore::Error, "nested transaction" + end + end + begin @rdonly = read_only @abort = false file = open_and_lock_file(@filename, read_only) @@ -338,10 +346,10 @@ class PStore value = yield(self) end end + ensure + @lock.unlock end value - rescue ThreadError - raise PStore::Error, "nested transaction" end private