MYSQL - блокировка пустых строк - PullRequest
2 голосов
/ 16 июня 2011

Как я могу заблокировать пустые строки?

Я хочу заблокировать пустой выбор, например:

Сессия 1

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from users where username = 'nousername' for update;
Empty set (0.01 sec)

mysql>

Сессия 2

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from users where username = 'nousername' for update;
Empty set (0.00 sec)

mysql>

Мне нужно, чтобы сессия 2 дожидалась завершения сессии 1, прежде чем был возвращен результат.

Как мне этого добиться?

Спасибо?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2016

Там у вас есть три варианта, каждый из которых имеет свои преимущества и недостатки, я предпочитаю выбрать для обновления или блокировки таблиц:

1.консультативная блокировка get_lock() как упомянуто @Denis:

минусы:

  • не очищается при коммите, откате,

  • общесистемные имена, поэтому вы должны реализовать свое собственное уникальное имя

профи:

  • не очищает существующиетранзакции

  • не блокируют другие запросы

2.блокировка таблицы lock tables

плюсы:

  • очищается при коммите, откате,

  • заблокировки базы данных

минусы:

  • очищает существующие транзакции

3.Блокировка таблиц с помощью псевдо-выбора - вместо конкретного выбора, я использую общий выбор select max(users_id) from users for update

плюсы:

  • очищается с помощью коммита, отката,

  • за блокировку базы данных

  • не очищает существующие транзакции

минусы:

  • не работает, если таблица пуста (нужно вставить псевдоряд или использовать выделенную таблицу для блокировок)
1 голос
/ 16 июня 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...