Howard Chu wrote "Just follow the recommendation to open all handles at the beginning of the program."
But what if I have lots of named databases like maybe 10000 or more. Wouldn't this be expensive. I am developing a MongoDB like database (similar in query and update syntax) around LMDB. The thing is I have some enhancements on my own like the ability to generate update queries from within an ongoing update. So in a multi threaded environment, if the name of a named dbi is generated from within a write transaction (thread1) and proceeds to mdb_dbi_open it only to find that another read transaction (thread 2) just opened the same named dbi after the write-txn of thread 1 started, the prospect of mdb_dbi_open the same named dbi for thread 1 is lost forever. On Sun, May 21, 2017 at 3:00 AM, Muhammed Muneer <elend...@gmail.com> wrote: > My bad. > Didn't think it that way. > Thanks for the info. > > On Sun, May 21, 2017 at 1:51 AM, Howard Chu <h...@symas.com> wrote: > >> Muhammed Muneer wrote: >> >>> Thanks for clarifying. >>> I did get the impression but there was some part of it where I thought >>> the doc >>> was not clear enough. >>> >> >> It is a fundamental principle of ACID transactions. The "I" in ACID >> stands for Isolation. That means nothing that changes elsewhere, while a >> transaction is underway, can affect that particular transaction. Since we >> already document that LMDB is a full ACID DB engine, none of this should >> require any further explanation. >> >> Thanks anyway. >>> >>> On Sat, May 20, 2017 at 10:46 PM, Howard Chu <h...@symas.com >>> <mailto:h...@symas.com>> wrote: >>> >>> Muhammed Muneer wrote: >>> >>> Is the following valid. >>> >>> 1) Read transaction 1 is started >>> 2) Read transaction 2 is started and calls mdb_dbi_open and >>> commits >>> 3) Read transaction 1 uses the handle from (2) >>> >>> >>> Please learn how to read. The doc says more than you quoted before, >>> and it >>> already quite explicitly defines its properties: >>> >>> http://www.lmdb.tech/doc/group__internal.html#gac08cad5b0969 >>> 25642ca359a6d6f0562a >>> <http://www.lmdb.tech/doc/group__internal.html#gac08cad5b096 >>> 925642ca359a6d6f0562a> >>> >>> The database handle will be private to the current >>> transaction >>> until the transaction is successfully committed. If the transaction >>> is >>> aborted the handle will be closed automatically. After a successful >>> commit >>> the handle will reside in the shared environment, and may be used by >>> other >>> transactions. >>> >>> In your question above, transaction 1 is not after transaction 2 >>> therefore >>> it cannot use the handle that transaction 2 commits. >>> >>> The handle does not exist in the shared environment until after its >>> opening transaction commits. If it doesn't exist in the shared >>> environment >>> when a transaction begins, then it is not visible or valid in that >>> particular transaction. >>> >>> Just follow the recommendation to open all handles at the beginning >>> of the >>> program. >>> >>> >>> >>> On Sat, May 20, 2017 at 6:46 PM, Muhammed Muneer < >>> elend...@gmail.com >>> <mailto:elend...@gmail.com> >>> <mailto:elend...@gmail.com <mailto:elend...@gmail.com>>> wrote: >>> >>> Thanks. >>> >>> On Sat, May 20, 2017 at 6:29 PM, Klaus Malorny >>> <klaus.malo...@knipp.de <mailto:klaus.malo...@knipp.de> >>> <mailto:klaus.malo...@knipp.de <mailto: >>> klaus.malo...@knipp.de>>> >>> >>> wrote: >>> >>> On 5/20/17 2:02 PM, Muhammed Muneer wrote: >>> >>> So when the doc says >>> >>> * The database handle will be private to the >>> current >>> transaction until >>> * the transaction is successfully committed. >>> >>> "the handle being private" only refers to the first >>> mdb_dbi_open. >>> Once this transaction is committed, one doesn't have >>> to >>> call this >>> again in subsequent concurrent transactions and can >>> use >>> this handle. >>> And then this handle won't be private at all. >>> >>> Did I get it right? >>> >>> >>> Yes. I do this exactly that way as part of my initial >>> setup of my >>> application. Once the transaction is committed, I use >>> the returned >>> handles setup from whatever thread that needs to access >>> the >>> respective >>> database. I never call mdb_dbi_open again after the >>> setup. >>> >>> Regards, >>> >>> Klaus >>> >>> >> >> >> -- >> -- Howard Chu >> CTO, Symas Corp. http://www.symas.com >> Director, Highland Sun http://highlandsun.com/hyc/ >> Chief Architect, OpenLDAP http://www.openldap.org/project/ >> > >