2016-07-11 19 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일

업데이트합니다. 사실, 내가 가진 표는

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는

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' 

이다.

답변

0

자동 증가가 아닌 기본 키를 직접 삽입하려는 경우 트랜잭션이 생성하도록 의도 된 동작은 정확히 이고 원하는 동작은입니다. 당신이 커밋 Trans 2를 원하시면

는 다음 중 하나를하지 기본 키를 지정하거나 응용 프로그램에 기본 키 할당을 처리해야합니다.

+0

안녕하세요, 자세한 내용은 질문을 수정하고 업데이트하십시오. – zhfkt

+0

나는 무엇을하고 싶은지 잘 모르겠습니다. 이 문맥에서 "NULL check transaction"이란 무엇입니까? ** 동일한 기본 키를 다시 커밋하려고하면 원하는 결과는 무엇입니까? ** – dotancohen

+0

방금 ​​webapp가 있으며 "사용자 등록 페이지"가 ​​있습니다. 사용자가 사용자 이름을 등록하려고하면 webapp는 동일한 사용자 이름이 데이터베이스에 있는지 확인합니다. "NULL check transaction"은 지정된 사용자 이름이 데이터베이스에 있는지 확인하는 것입니다. 두 명의 사용자가 2 개의 트랜잭션에서 동일한 사용자 이름을 등록하려는 경우 위의 상황을 시뮬레이션합니다. – zhfkt