2016-07-11 1 views
0

MYSQLにNULLチェックロジックを実装したいと思います。コードは次のとおりです。mysqlで複数のNULLチェックトランザクションを実装する方法

mysql> create table temp 
(
id int, 
des varchar(100), 
primary key (id) 
); 

mysql> SELECT @@tx_isolation; 
+-----------------+ 
| @@tx_isolation | 
+-----------------+ 
| REPEATABLE-READ | 
+-----------------+ 

mysql> start transcation; 

mysql> select * from temp where id=0; 
Empty set (0.03 sec) 

mysql> insert temp (id,des) values(0,'0'); 
Query OK, 1 row affected (0.11 sec) 

mysql> commit; 
Query OK, 0 rows affected (0.02 sec) 

これはうまくいくようです。

しかし、自分の状況で同時に複数のNULLチェックトランザクションが発生する可能性があります。

Trans 1:            Trans 2: 

mysql> start transaction;       mysql> start transaction;   

mysql> select * from temp where id=0; 
Empty set (0.03 sec) 

                mysql> select * from temp where id=0; 
                Empty set (0.03 sec) 

mysql> insert temp (id,des) values(0,'0'); 
Query OK, 1 row affected (0.11 sec) 

                mysql> insert temp (id,des) values(0,'0'); 


mysql> commit; 
Query OK, 0 rows affected (0.02 sec) 

                --block and waiting for the Trans 1 commit; 
                ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY' 

Trans 2は、Trans 1がコミットするとERROR 1062を報告します。私はエラーを避けたいと思うし、それはアプリケーションでNULLチェックの普遍的な現象だと思う。

mysqlで複数のNULLチェックトランザクションを正しく実装するにはどうしたらいいですか?複数の変換で "select" SQLを使用すると、互いにブロックする方法はありますか?

ありがとうございます。

更新2016年7月12日

私はちょうど私が上記と会うの状況を簡素化します。実際には、私が持っているテーブルが

Trans 1:           Trans 2: 

mysql> start transaction;       mysql> start transaction;   

mysql> select * from temp where unique_id=0; 
Empty set (0.06 sec) 

                mysql> select * from temp where unique_id=0; 
                Empty set (0.02 sec) 

mysql> insert temp(des,unique_id) values('0',0); 
Query OK, 1 row affected (0.20 sec) 

                mysql> insert temp(des,unique_id) values('0',0); 


mysql> commit; 
Query OK, 0 rows affected (0.02 sec) 

                --block and waiting for the Trans 1 commit; 
                ERROR 1062 (23000): Duplicate entry '0' for key 'unique_id' 

mysql> create table temp 
(
id int NOT NULL AUTO_INCREMENT, 
des varchar(100), 
unique_id int, 
primary key (id), 
UNIQUE (unique_id) 
); 

そして、私の取引に似ていているので、PRIMARY KEYは、私の実際のケースでAUTO_INCREMENTです。

答えて

0

自動増分とは対照的に、主キーを自分で挿入することをお勧めする場合、トランザクションが作成するように設計されているのは、ちょうどと希望のです。

あなたはTrans 2コミットしたい場合は、どちらかにない必要主キーを指定するか、アプリケーションの主キーの割り当てを処理します。

+0

こんにちは、私は編集し、詳細を更新する – zhfkt

+0

あなたは何をしたいのか分かりません。このコンテキストでは、「NULLチェック・トランザクション」とは何ですか? **同じ基本キーをもう一度コミットしようとすると、あなたの望む結果は何ですか?** – dotancohen

+0

私はwebappを持っていて、 "user register page"があります。ユーザーがユーザー名を登録する場合、webappは同じユーザー名がデータベースにあるかどうかをチェックします。 「NULLチェックトランザクション」は、指定されたユーザ名がデータベースにあるかどうかをチェックすることです。 2人のユーザーが2つのトランザクションで同じユーザー名を登録したい場合は、上記の状況をシミュレートします。 – zhfkt

関連する問題