Я пытаюсь использовать блокировку строки MySQL, чтобы в основном эмулировать MuteEx на строке. Позволяет говорят, что моя таблица имеет 2 столбца, идентификатор и текстовое поле и три записи (1, a) (2, b) и (3, c). ВЫБЕРИТЕ * таблица FROM; возвратил бы эти результаты. Я могу заблокировать определенную строку нормальный путь.
START TRANSACTION;
BEGIN;
SELECT * FROM table WHERE id = '2' FOR UPDATE;
Однако, если от второго соединения я должен был ВЫБРАТЬ * из таблицы. Это возвратило бы все 3 результата. Существует ли путь к блокировке уровня строки, чтобы в основном препятствовать тому, чтобы какой-либо ВЫБОР видел/использовал строку, которая заблокирована? В основном я пытаюсь препятствовать тому, чтобы любой использовал строку, которая в настоящее время используется/управляется, или даже просматривающей строку как ее данные (так как она используется/управляется), не может доверяться, чтобы быть точным во время ВЫБОРА.
На самом деле, данным строки можно доверять даже во время манипулирования.
Если вы начинаете транзакцию с одного соединения, другие соединения не увидят никаких ваших изменений до тех пор, пока вы не зафиксируете транзакцию.
Я не знаю, существует ли родственный, фиксирующий конкретный механизм, чтобы сделать это, но мой первый нестин будет, чтобы дать стол столбца состояния (например, заблокирован
) и установка, чтобы 1
При блокировке строки. A Выберите
Чувствителен , чувствительно к этому всегда добавлю , где заблокировано! = '1'
Условие для любого запроса.
На боковом примечании я не знаю, что вы делаете, но не эта задача, которая должна быть сделана на уровне или двух вышеуказательстве.
Если вы установите уровень изоляции транзакции на 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