Daniel Kraft wrote:
On 2018-11-13 09:59, hyc@highlandsun.com wrote:
On Tue, Nov 13, 2018 at 07:09:08AM +0000, Daniel Kraft wrote:
On 2018-11-12 21:21, Howard Chu wrote: Ah ok, so mdb_txn_commit also frees the transaction if it then actually fails with MDB_MAP_FULL -- I was missing that. By avoiding the mdb_txn_abort in that case, my example code indeed works now!
So is it correct to assume that the transaction is "effectively aborted" after mdb_txn_commit fails with MDB_MAP_FULL (or, for that matter, any error)?
http://www.lmdb.tech/doc/group__mdb.html#ga846fbd6f46105617ac9f4d76476f6597
The doc is quite clear. After you call commit the txn is freed.
Yes, that part is clear (I just missed it before).
But the doc doesn't say anything about what happens to the transaction data in case of an error. I think it is quite reasonable to assume that the transaction is fully aborted (as if mdb_txn_abort was called instead of mdb_txn_commit) in case of an error (since otherwise transaction atomicity would be violated), but I just wanted to check this is indeed what happens.
Imagine if the txn were not aborted in case of error. The txn structure is gone, already freed, so what are you going to do to clean it up?
There is only one sensible outcome.