Как блокировками может быть реализован уровень изоляции транзакций Serializable?
Концепция этого уровня изоляции и других понятна. И если говорить о других уровнях, то примерно понятно как их можно реализовать блокировками. Вот примерное понимание других уровней без углублений:
- Read Uncommited - добавляет эксклюзивную блокировку на каждую операцию записи, которая завершает свое действие сразу после записи (не дожидаясь конца транзакции)
- Read Commited - добавляем к прошлому уровню разделяемую блокировку на чтение, которая завершает свое действие сразу после чтения
- Repeatable Read - вместо Read Commited блокировка на чтение завершает свое действие только после завершения транзакции.
Но как делают Serializable в таком случае? Тонкости реализации может и отличные, но хотелось бы хоть на поверхностном уровне понимать.
Ответы (1 шт):
Блокировки взятые в Serializable транзакции по строкам, которые были в ней изменены остаются активными после завершения данной транзакции, до тех пор пока не будут завершены все другие Serializable транзакции, которые были начаты до завершения текущей. В случае если другая Serializable транзакция при чтении данных наткнется на такую блокировку она будет отменена и выдана ошибка сериализации, по которой прикладной код может повторить транзакцию с самого начала.
Данный механизм используется как минимум postgresql, согласно документации