2017-06-28 5 views
0

リソースうち、ユーザチェックが、私はリソースとユーザーのために行を挿入しようとする場合。私は、例えば、MySql(InnoDB)/ Maria:挿入、無視、ロック、選択?

"CREATE TABLE foo (
    resource_id BIGINT UNSIGNED NOT NULL, 
     user_id BIGINT UNSIGNED NOT NULL, 
    PRIMARY KEY (resource_id) 
) ENGINE = InnoDB $collate;"); 

エンドユーザのロックシステムを実装しようとしています既にロックを保持している間に、既存の行からそのユーザーIDを選択したい場合は、指定されたリソースに対して別のユーザーエントリが既に存在する可能性があります。既存の行がない場合は、挿入を成功させ、ロックを解除する前に挿入したのと同じユーザーIDを選択します。

このようなことは、私が望んでいることをするか、より良い方法がありますか? https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.htmlによると

START TRANSACTION; 
INSERT IGNORE INTO foo (resource_id, user_id) VALUES (4, 2) 
SELECT user_id FROM foo WHERE resource_id = 4 
COMMIT; 

答えて

0

重複キーエラーが発生した場合、重複したインデックスレコード上の共有ロックが設定されています。

これを考えると、同じトランザクション内でINSERT IGNOREとSELECTを実行する必要があります。