Транзакции, блокировки, уровни изоляции - PullRequest
4 голосов
/ 18 сентября 2011

У меня есть несколько вопросов относительно предмета из названия. Прежде всего, давайте предположим, что мы работаем с JDBC, и там у нас есть 2 транзакции T1 и T2. В T1 мы выполняем оператор выбора в одной конкретной строке. Затем мы выполняем обновление в этой строке. В транзакции T2 мы выполняем оператор выбора в той же строке.

Вот вопросы:

1) Когда транзакция T1 получает блокировку в указанной строке? Я предполагаю, что это происходит во время выполнения оператора select?

2) Как долго транзакция T1 удерживает блокировку? Он удерживает его до тех пор, пока транзакция не будет зафиксирована / откатана, или до этого снимет блокировку?

3) Контролирует ли уровень изоляции, какой тип блокировки используется? Например:

a) если мы используем read commit уровень изоляции для транзакции T2, означает ли это, что T2 будет использовать общую блокировку чтения для оператора select, так что в случае обновления T1 строка уже T2 не будет иметь доступа в эту строку (избегая грязного чтения), и в случае, если T1 еще не обновил строку, у T2 будет доступ для чтения к этой строке?

b) Если мы используем read uncommitted уровень изоляции в транзакции T2, означает ли это, что T2 будет использовать no-lock для оператора select, поэтому он может читать данные, даже если они модифицируются T1 (позволяя за грязные чтения).

Итак, вопрос, который меня больше всего беспокоит, заключается в том, кто контролирует, какой тип блокировки применяется? Это уровень изоляции транзакции или есть какой-то другой способ?

4) Если ответ на вопрос 3 положительный (уровень изоляции контролирует, какие блокировки используются), то что произойдет, если мы используем, например, jdbc поверх базы данных mysql, и используем select для обновления или select lock в конструкциях режима совместного использования? Как я помню, первая - это эксклюзивная блокировка, а вторая - общая блокировка чтения. Как это отразится на уровне изоляции наших транзакций?

5) Какой тип блокировки получается в случае повторяемого чтения уровня изоляции? Предположим, что наш T2 (с повторяемым уровнем изоляции для чтения) имеет два оператора выбора в одной строке, в то время как T1 такой же, как и раньше. Сначала выполняется один оператор выбора в T2, затем T1 выполняется и фиксируется, и после этого выполняется второй выбор T2. Возможен ли этот сценарий? Если транзакции удерживают свои блокировки до тех пор, пока они не будут зафиксированы / отменены, я предполагаю, что T1 не сможет получить эксклюзивную блокировку для обновления, пока T2 не будет завершен?

РЕДАКТИРОВАТЬ: Еще один вопрос:

6) В многоверсионной системе управления параллелизмом, когда мы устанавливаем сериализуемый уровень изоляции, транзакция A, которая пытается обновить некоторую строку, которая обновляется другой транзакцией B (B обновила строку после запуска A), будет откатиться назад. Я хочу спросить, разве это не то же самое, что происходит в сценариях оптимистичной блокировки?

Заранее спасибо.

1 Ответ

2 голосов
/ 06 июня 2016

Ваш вопрос хороший. Понимание того, какие блокировки получены, позволяет глубоко понять СУБД. В SQL Server для всех уровней изоляции (Чтение незафиксированных, Чтение зафиксировано (по умолчанию), Повторяемые чтения, Сериализуемые) Для операций записи получены исключительные блокировки.

Исключительные блокировки снимаются по завершении транзакции независимо от уровня изоляции.

Разница между уровнями изоляции относится к способу получения / разблокировки общих (считываемых) блокировок.

При уровне изоляции Read Uncommitted, общие блокировки не устанавливаются. На этом уровне изоляции может возникнуть проблема параллелизма, известная как «грязное чтение».

При уровне изоляции Read Committed для соответствующих записей создаются общие блокировки. Общие блокировки снимаются по окончании текущей инструкции. Этот уровень изоляции предотвращает «грязное чтение», но, поскольку запись может обновляться другими параллельными транзакциями, могут возникать «неповторяющиеся чтения» или «фантомные чтения».

При уровне изоляции Repeatable Reads общие блокировки приобретаются на время транзакции. «Грязные чтения» и «Неповторяющиеся чтения» запрещены, но «Фантомные чтения» все еще могут происходить.

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

...