2016-07-11 6 views
0

Я хочу реализовать логику проверки NULL в MYSQL. Вот код:Как реализовать множественную транзакцию проверки NULL в mysql

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' 

Передача 2 сообщит об ошибке ERROR 1062, когда передача 1 передана. Я хочу избежать ошибки, и я думаю, что это универсальный феномен проверки NULL в приложении.

Как реализовать множественную транзакцию проверки NULL в mysql правильно? Есть ли способ блокировать друг друга при использовании «select» sql в многократной трансакции?

спасибо.

обновление 2016.07.12

Я просто упрощать ситуацию, я встречаюсь с выше. На самом деле, у меня есть таблица похожа на

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

И мои сделки

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' 

Таким образом, первичный ключ AUTO_INCREMENT в моем реальном случае.

ответ

0

Если вы настаиваете на том, чтобы вставить первичный ключ самостоятельно, в отличие от его автоинкремента, то это именно ожидаемое и желаемое поведение, которое были созданы для создания транзакций.

Если вы хотите Trans 2 совершить, то вам необходимо либо не определить первичный ключ или обработки первичного ключа распределения в приложении.

+0

Привет, я редактирую и обновляю вопрос для получения более подробной информации – zhfkt

+0

Я не уверен, что вы хотели бы сделать. Что такое «транзакция NULL check» в этом контексте? ** Когда вы пытаетесь сделать один и тот же первичный ключ во второй раз, каков ваш желаемый результат? ** – dotancohen

+0

У меня просто есть webapp и есть страница регистрации пользователя. Когда пользователь хочет зарегистрировать имя пользователя, webapp проверяет, находится ли в базе данных одно и то же имя пользователя. «NULL check transaction» - проверить, указано ли указанное имя пользователя в базе данных. Я имитирую ситуацию выше, если два пользователя хотят зарегистрировать одно и то же имя пользователя в двух транзакциях. – zhfkt