Я читал про 4 уровня изоляции:
Isolation Level Dirty Read Nonrepeatable Read Phantom Read
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED -- Permitted Permitted
REPEATABLE READ -- -- Permitted
SERIALIZABLE -- -- --
Я хочу понять блокировку каждой транзакции в таблице.
READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)
Ниже приведены три явления, которые могут возникнуть при изоляции транзакции.
Грязное чтение - нет блокировки
Неповторяющееся чтение - нет грязного чтения в качестве блокировки зафиксированных данных
Фантомное чтение - блокировка блока sql (который выбирается с помощью запроса выбора)
Я хочу понять, где мы определяем эти уровни изоляции: только на уровне jdbc / hibernate или также в БД
PS: Я просмотрел ссылки в уровнях изоляции в oracle , но они выглядят неуклюже и говорят о конкретной базе данных
java
transactions
isolation-level
Ученик
источник
источник
Ответы:
Например, у вас есть 3 параллельных процесса A, B и C. A запускает транзакцию, записывает данные и выполняет фиксацию / откат (в зависимости от результатов). B просто выполняет
SELECT
инструкцию для чтения данных. C читает и обновляет данные. Все эти процессы работают на одном столе T.WHERE aField > 10 AND aField < 20
, A вставляет данные,aField
значение которых находится в диапазоне от 10 до 20, затем B считывает данные снова и получает другой результат.Используя JDBC, вы определяете его с помощью
Connection#setTransactionIsolation
.Использование гибернации:
куда
Конфигурация гибернации взята отсюда (извините, это на испанском языке).
Кстати, вы можете установить уровень изоляции и на РСУБД:
SET ISOLATION TO DIRTY READ
предложении.)и так далее...
источник
Как говорит brb tea, это зависит от реализации базы данных и используемого алгоритма: MVCC или двухфазная блокировка.
CUBRID (СУБД с открытым исходным кодом) объясняет идею этих двух алгоритмов:
MVCC допускает одновременные модификации за счет увеличения накладных расходов в памяти (поскольку он должен поддерживать разные версии одних и тех же данных) и вычислений (на уровне REPETEABLE_READ вы не можете потерять обновления, поэтому он должен проверять версии данных, например Hiberate делает с блокировкой Optimistick ).
В 2PL уровень изоляции транзакций контролирует следующее :
Конкретные примеры связи между блокировками и уровнями изоляции в SQL Server (используйте 2PL, кроме READ_COMMITED с READ_COMMITTED_SNAPSHOT = ON)
READ_UNCOMMITED: не применять разделяемые блокировки для предотвращения изменения данных, считываемых текущей транзакцией, другими транзакциями. READ UNCOMMITTED транзакции также не блокируются эксклюзивными блокировками, которые не позволят текущей транзакции читать строки, которые были изменены, но не зафиксированы другими транзакциями. [...]
READ_COMMITED:
REPETEABLE_READ: общие блокировки устанавливаются на все данные, считываемые каждым оператором в транзакции, и удерживаются до завершения транзакции.
SERIALIZABLE: блокировки диапазона помещаются в диапазон значений ключа, который соответствует условиям поиска каждого оператора, выполняемого в транзакции. [...] Блокировки диапазона удерживаются до завершения транзакции.
источник
Блокировки всегда принимаются на уровне БД: -
Официальный документ Oracle: - Чтобы избежать конфликтов во время транзакции, СУБД использует блокировки, механизмы для блокировки доступа других лиц к данным, к которым обращается транзакция. (Обратите внимание, что в режиме автоматической фиксации, где каждый оператор является транзакцией, блокировки удерживаются только для одного оператора.) После установки блокировки она остается в силе до тех пор, пока транзакция не будет зафиксирована или откат. Например, СУБД может заблокировать строку таблицы до тех пор, пока в ней не будут зафиксированы обновления. Эффект этой блокировки будет заключаться в том, чтобы не дать пользователю получить грязное чтение, то есть прочитать значение до того, как оно станет постоянным. (Доступ к обновленному значению, которое не было зафиксировано, считается «грязным» чтением, потому что это значение может быть откатано до его предыдущего значения. Если вы прочитаете значение, которое позже откатывается, вы прочитаете недопустимое значение. )
Способ установки блокировок определяется так называемым уровнем изоляции транзакции, который может варьироваться от полного отсутствия поддержки транзакций до поддерживающих транзакций, которые обеспечивают соблюдение очень строгих правил доступа.
Одним из примеров уровня изоляции транзакции является TRANSACTION_READ_COMMITTED, который не позволит получить доступ к значению до тех пор, пока оно не будет зафиксировано. Другими словами, если уровень изоляции транзакции установлен на TRANSACTION_READ_COMMITTED, СУБД не допускает грязных чтений. Интерфейс Connection включает пять значений, которые представляют уровни изоляции транзакции, которые вы можете использовать в JDBC.
источник