0

私はこれを読みました: ネストされたセットにノードを安全に挿入しますか?

しかし、ネストされたセットモデルに新しいノードを挿入する際のロックが心配でした。ツリー カテゴリに新しいノードを挿入したいのですが、新しいノードが破損することなく挿入されることを確認したいです。mysql で使用されるエンジンは InnoDb です。他の質問が言うように:

 BEGIN; -- or whatever API your framework has for starting a transaction
   SELECT @myLeft := lft FROM myTable WHERE ID = $id FOR UPDATE;  
   UPDATE myTable SET rgt = rgt + 2 WHERE rgt > @myLeft;       
   UPDATE myTable SET lft = lft + 2 WHERE lft > @myLeft;       
   INSERT INTO myTable(title, lft, rgt) VALUES($title, @myLeft + 1, @myLeft + 2);
 COMMIT; -- or whatever API your framework has for commiting a transaction

私の問題は、同時ユーザーが同じツリーに新しいノードを挿入しようとした場合、トランザクションは他のノードの左右を更新および調整するのに十分ですか? ユーザー1が新しいノードを追加し(トランザクション1で実行)、同時にユーザー2が新しいノードを追加する(トランザクション2で実行)場合、ユーザー2が新しいノードを挿入する前に、ユーザー2がユーザー1によって追加されたノードで更新されたツリーを読み取ったと確信していますか?では、100 人のユーザーが新しいノードを挿入するのと同じ時間に、最後のユーザーはプレビュー ユーザーが終了するまで待たなければならず、一貫性ツリーが常に存在するのでしょうか?

4

1 に答える 1

0

InnoDB は行レベルのロックを行います。したがって、更新中の行は、トランザクションの間ロックされます。これにより、ブロックやデッドロックが発生する可能性があります。

行が更新されている場合、InnoDB は行のロックを取得して再度更新することはできません。これにより、トランザクションが効果的にシリアル化されます。トランザクションの分離レベルを制御できることに注意してください。このリンクを参照してくださいhttp://dev.mysql.com/doc/refman/5.1/en/dynindex-isolevel.html

innodb エンジンでデッドロックを探す方法に関する興味深い記事もここにあります http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/

ネストされたセットが大幅に更新されている場合は、適切な分離レベルがあることを確認し、ステートメントをトランザクションでラップするだけで十分です。ただし、コーディングが必要なロック、ブロッキング、およびデッドロックの問題が発生する可能性があります。

于 2012-05-07T13:35:55.553 に答える