Как сознательно заблокировать строку MySQL, таким образом, что даже SELECT возвратит ошибку?

Я пытаюсь использовать блокировку строки MySQL, чтобы в основном эмулировать MuteEx на строке. Позволяет говорят, что моя таблица имеет 2 столбца, идентификатор и текстовое поле и три записи (1, a) (2, b) и (3, c). ВЫБЕРИТЕ * таблица FROM; возвратил бы эти результаты. Я могу заблокировать определенную строку нормальный путь.

START TRANSACTION;
BEGIN;
SELECT * FROM table WHERE id = '2' FOR UPDATE;

Однако, если от второго соединения я должен был ВЫБРАТЬ * из таблицы. Это возвратило бы все 3 результата. Существует ли путь к блокировке уровня строки, чтобы в основном препятствовать тому, чтобы какой-либо ВЫБОР видел/использовал строку, которая заблокирована? В основном я пытаюсь препятствовать тому, чтобы любой использовал строку, которая в настоящее время используется/управляется, или даже просматривающей строку как ее данные (так как она используется/управляется), не может доверяться, чтобы быть точным во время ВЫБОРА.

8
задан bahhumbug 12 January 2010 в 18:10
поделиться

3 ответа

На самом деле, данным строки можно доверять даже во время манипулирования.

Если вы начинаете транзакцию с одного соединения, другие соединения не увидят никаких ваших изменений до тех пор, пока вы не зафиксируете транзакцию.

2
ответ дан 5 December 2019 в 14:03
поделиться

Я не знаю, существует ли родственный, фиксирующий конкретный механизм, чтобы сделать это, но мой первый нестин будет, чтобы дать стол столбца состояния (например, заблокирован ) и установка, чтобы 1 При блокировке строки. A Выберите Чувствителен , чувствительно к этому всегда добавлю , где заблокировано! = '1' Условие для любого запроса.

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

0
ответ дан 5 December 2019 в 14:03
поделиться

Если вы установите уровень изоляции транзакции на SERIALIZABLE , InnoDB неявно добавит LOCK IN SHARE MODE для всех операторов SELECT .

Этот режим конфликтует с блокировками, установленными с помощью SELECT FOR UPDATE , и SELECT будут заблокированы.

Обратите внимание, что InnoDB может заблокировать больше строк, чем удовлетворяет условию WHERE . Это потому, что он блокирует все строки , просканированные , а не только те совпадающие .

Допустим, у вас есть индекс на col1 , и этот запрос:

SELECT  *
FROM    mytable
WHERE   col1 = 1
        AND col2 = 2
FOR UPDATE

использует этот индекс.

Это заблокирует все записи с col1 = 1 , даже те, у которых col2 <> 2

5
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: