2017/12/11

[lmdb]トランザクションのネスト

lmdbのトランザクションはmdb_txn_begin()で始まるが、ネストはできるのだろうか?

LMDB: Getting Started

Transactions may be read-write or read-only, and read-write transactions may be nested. A transaction must only be used by one thread at a time. Transactions are always required, even for read-only access.

R/Wであればネストでき... may beって?
Google翻訳だと「入れ子になっている可能性があります」と訳されたんだけど、「入れ子にすることもできる」の方が正しいのかな。


では、とmdb_txn_begin()をR/Wで2回呼んだのだが、2回目で止まってしまった。
話が違うでは無いか!
2回目のオプションでMDB_RDONLYを付けるといけるのだが、そういう意味でネストできると書いているのだろうか?
いや、今作っているプログラムで2回呼び出して書込んでいるルートがあったので、こうやって心配になって確認しているのだ。
心配だったので回避させたのだが、もしかしたら別スレッドからだったのでロックしなかっただけかもしれない。

スレッドごとに別トランザクションが発生するのは、使い方はよろしくないかもしれない。

A transaction must only be used by one thread at a time.

これは・・・一度作ったトランザクションをスレッド間で使い回すな、という意味だろうか。
「be used」なので、使い回すのはダメだけどbegin()すること自体は問題ない、と捉えてよいのか。。。


ちなみに、straceでロックするところを見てみると、futex(FUTEX_WAIT)を最後に実行していた。
lmdbはPOSIXのlock fileを使うと書いてあったので、ファイルロックしていたからfutexで変化するのを待っているのか?


結果として、何も分からんかった、ということになる。
最初のbegin()がR/Wで、2回目がReadOnlyであればいけることはわかった、というくらいだ。

データ保存はDBにお任せ、と気楽に考えて作っていたのだが、高速性を売りにしているということは管理をアプリ側である程度はやるのが前提なのだろう。
まあ、考えてみれば、そうなるな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。