У меня есть несколько вопросов относительно предмета из названия. Прежде всего, давайте предположим, что мы работаем с 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), будет откатиться назад. Я хочу спросить, разве это не то же самое, что происходит в сценариях оптимистичной блокировки?
Заранее спасибо.