Во многих случаях ваш оператор UPDATE не будет препятствовать прочтению строки другими транзакциями.
упомянутые уровни изоляции транзакций.
В зависимости от уровня изоляции базы данных используют разные типы блокировок. На самом высоком уровне блокировку можно разделить на две категории:
- пессимистично,
- оптимистично
Например, MS SQL 2008 имеет 6 уровней изоляции, 4 из них пессимистичные, 2 оптимистичные. По умолчанию используется уровень изоляции READ COMMITTED, который относится к пессимистической категории.
Oracle, с другой стороны, по умолчанию использует оптимистическую блокировку.
Заявление, которое заблокирует вашу запись для записи:
SELECT * FROM TBL WITH UPDLOCK WHERE id=@id
С этого момента никакая другая транзакция не сможет обновить вашу запись с id = @ id
И только транзакции, работающие на уровне изоляции READ UNCOMMITTED, смогут прочитать его.
При уровне транзакции по умолчанию READ COMMITTED никакая другая операция не сможет прочитать или записать эту запись, пока вы не подтвердите или не откатите всю транзакцию.