Это предотвратит чтение строки во время транзакции? - PullRequest
1 голос
/ 13 апреля 2010

Я помню пример, когда чтение в транзакции с последующей записью данных небезопасно, потому что другая транзакция может читать / записывать данные в промежутке времени. Поэтому я хотел бы проверить дату и предотвратить изменение или чтение строки, пока моя транзакция не будет завершена. Будет ли это сделать трюк? и есть ли какие-либо варианты SQL, что это не будет работать?

update tbl set id=id where date>expire_date and id=@id

Примечание: дата> expire_date является моим условием. Это может быть что угодно. Это помешает другой транзакции прочитать строку, пока я не выполню фиксацию или откат?

Ответы [ 4 ]

1 голос
/ 13 апреля 2010

Во многих случаях ваш оператор UPDATE не будет препятствовать прочтению строки другими транзакциями.

упомянутые уровни изоляции транзакций.

В зависимости от уровня изоляции базы данных используют разные типы блокировок. На самом высоком уровне блокировку можно разделить на две категории:
- пессимистично,
- оптимистично

Например, MS SQL 2008 имеет 6 уровней изоляции, 4 из них пессимистичные, 2 оптимистичные. По умолчанию используется уровень изоляции READ COMMITTED, который относится к пессимистической категории.

Oracle, с другой стороны, по умолчанию использует оптимистическую блокировку.

Заявление, которое заблокирует вашу запись для записи:

SELECT * FROM TBL WITH UPDLOCK WHERE id=@id

С этого момента никакая другая транзакция не сможет обновить вашу запись с id = @ id И только транзакции, работающие на уровне изоляции READ UNCOMMITTED, смогут прочитать его.

При уровне транзакции по умолчанию READ COMMITTED никакая другая операция не сможет прочитать или записать эту запись, пока вы не подтвердите или не откатите всю транзакцию.

1 голос
/ 13 апреля 2010

Вы должны быть в состоянии сделать это в обычном режиме, используя комбинацию

HOLDLOCK / ROWLOCK

1 голос
/ 13 апреля 2010

Это очень хорошо может работать. Разные платформы предлагают разные услуги. Например, в T-SQL вы можете просто установить уровень изоляции транзакции и, как следствие, принудительно получить блокировку. Я не знаю, какую платформу вы используете, поэтому не могу ответить на ваш вопрос окончательно.

1 голос
/ 13 апреля 2010

Это зависит от уровня изоляции транзакции, который вы установили в своем контроле транзакций. Есть 4 типа чтения

READ UNCOMMITTED: this allows the dirty read
READ COMMITTED 
REPEATABLE READ
SERIALIZABLE

для получения дополнительной информации, вы можете проверить MSDN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...