Разделяемый или Исключительный режим блокировки #659732


#0 by Max Street
Привет. И снова управляемые блокировки:) Есть 2 варианта режима блокировки: разделяемый и исключительный. Первый используется, когда данные блокируются от записи, второй - от чтения и записи. Вопрос такой: а как же определить, когда нужно заблокировать чтение и запись, в когда только запись
#1 by andreymongol82
Методологически
#2 by Max Street
может есть другие варианты?
#3 by andreymongol82
Какие еще могут быть варианты? Смотрим что нужно сделать. Смотрим что изменится от этих действий. Выбираем. Кстати, в описании описание 2х режимов блокировке у вас ошибка. почитайте, хотя бы вот это
#4 by Max Street
спасибо
#5 by Spieluhr
от чтения нет блокировки
#6 by Serginio1
Если хочешь читать с повторным чтением то используй разделяемый  (REPEATABLEREAD) , если хочешь сначала прочитать, а затем записать то используй исключительный (SERIALIZABLE)
#7 by Spieluhr
речь об управляемых блокировках, на уровне СУБД - всегда READ COMMITED
#8 by Serginio1
Есть хинты REPEATABLEREAD и SERIALIZABLE заметь они и пишутся по другому. например
#9 by Max Street
сорри, выразился неправильно. речь идет об управляемых транзакционных блокировках. почему? вот определение: "исключительный режим блокировки подразумевает, что заблокированные данные не могут быть изменены другой транзакцией до окончания текущей транзакции, а также не могут быть прочитаны другой транзакцией, устанавливающей разделяемую блокиовку на эти данные". я чего-то не понимаю? объясните, пожалуйста
#10 by rs_trade
исключительная позволяет читать?
#11 by rs_trade
Хотя да.
#12 by Spieluhr
все верное понимаете. механизм работы СУБД таков (речь о работе в транзакции): сначала ставится блокировка, только потом считываются данные вне транзакции - да
#13 by Spieluhr
правило очень простое: если в транзакции будет запись каких-то данных, например строк табличной части в набор записей регистра, то сразу ставим на таблицу регистра исключительную по значениям в таб. части
#14 by rs_trade
А вообще ответ на вопрос содержиться как ни странно в Руководстве разработчика, на странице 556.
#15 by Serginio1
Например ты хочешь изменить данные. Тебе нужно сначала эти данные прочитать и сделать так, что бы эти данные не изменились. Если ты применишь к этим данным разделяемый режим, то другая транзакция тоже пишущая с этими позициями будет выполняться до записи 1 транзакции при этом заблокировав на запись. 1 транзакция хочет записать а не может так как вторая держит. Когда придет время писать второй она тоже не сможет так как записи держит 1 транзакция и получается дид лок
#16 by Max Street
спасибо большое. то, что нужно следовательно, разделяемый режим блокировки ставится в случае, если я только считываю данные из регистра, но не изменяю их. так?
#17 by krbIso
Почти, ставится если необходимо обеспечить неизменность считываемых данных до конца транзакции.
#18 by Max Street
спасибо большое
#19 by Serginio1
Например ты хочешь посчитать остаток на конкретную дату. Тебе нужно получить остаток на начало периода и движения до даты. Если ты будешь читать в транзакции READ COMMITED (по умолчаниб для управляемых), то уже прочитанные данные могут измениться и ты получишь неправильные данные, что бы этого не было ставится хинт REPEATABLEREAD запрешающий изменение уже прочитанных данных.
#20 by Max Street
сорри за мою безграммотность, но READ COMMITED и REPEATABLEREAD это соответственно исключительный и разделяемый режимы?
#21 by krbIso
это уровни изоляции, тип блокировок это S (Shared) и X (ex)
#22 by krbIso
хинт REPEATABLEREAD указывает что используется данный уровень изоляции, уровень изоляции определяет какая блокировка и на какое время будет установлена. т.е. в будет изменен уровень изоляции с READ COMMITED на REPEATABLEREAD и блокировка S будет продлена до конца транзакции.
#23 by Serginio1
Есть уровни изоляции транзакций Есть табличные указания
#24 by Max Street
спасибо. но эти блокировки используются вроде бы в режиме автоматических блокировок?
#25 by Serginio1
Автоматический использует уровень изоляции REPEATABL EREAD. Управляемый использует уровень изоляции READ COMMITED Для того что бы в этом режиме сделать повторяемое чтение нужно наложить хинт Select * From Таблица T4 WITH(REPEATABLEREAD) Если мы хотим применить исключительную блокировку применяем Select * FROM _Таблица T3 WITH(SERIALIZABLE)
#26 by Serginio1
Но еще есть хинт UPDLOCK
#27 by Serginio1
Без подсказок в управляемом режиме могут возникать ситуации описанные в 15
#28 by Serginio1
27 Тьфу читать Без подсказок в автоматическом режиме могут возникать ситуации описанные в 15, така как чтение там повторяющееся по умолчанию. А в управляемых ты сам контролируешь какие записи и как должны блокироваться.
#29 by Max Street
я что-то запутался совсем. а потому заранее прошу прощения за повторение, поправьте, пожалуйста, меня, если я не прав. Итак, при управляемых транзакционных блокировках испоьзуется режим Исключительный в случаях, когда я читаю данные и затем изменяю/записываю в набор записей. Если мне требуется обеспечить неизменность данных и данные я только читаю, но не изменяю их, я устанавливаю Исключительный режим. А что делать, чтобы избежать ситуации, описанной в ?
#30 by Max Street
* в предпоследней строке вместо Исключительный режим должно быть Разделяемый режим
#31 by Serginio1
Если ты только читаешь, то используешь разделяемый. При этом режиме не изменятся данные которые ты уже прочитал.
#32 by Max Street
спасибо. а как установить хинт REPEATABLEREAD?
#33 by Serginio1
Разделяемый
#34 by Serginio1
32 смотри 6
#35 by Max Street
Спасибо большое.
#36 by MM
Почему в этой теме столько неверных утверждений. В управляемом режиме используется только уровень изоляции транзакций READ COMMITED (или SNAPSHOT). Характерной чертой которого, является то, что происходит получение только данных завершённых транзакций, после чтения в этом режиме данные легко могут быть изменены любой другой транзакцией. Задержка может быть только при попытке прочитать изменённые, но не зафиксированные данные. Уровень SNAPSHOT (доступен в 8.3) позволяет, прочитать данные на начало транзакции независимо от того изменились ли они другими транзакциями. Т.о. исключительная блокировка (ставится сервером 1С, сервер СУБД о ней не знает) позволяет не допустить изменения (возможно уже прочитанных) данных до конца транзакции, в течении которой их будут менять. Чтобы избежать ситуации когда, 1я транзакция прочитала остатки, 2я прочитала - остатков достаточно, 1я записала и закончилась, а затем 2я записала поверх данных первой. В результате получаем минусы в остатках.
#37 by Serginio1
.. Т.о. исключительная блокировка (ставится сервером 1С, сервер СУБД о ней не знает) .. Угу FROM _AccRg5523 T3 WITH(SERIALIZABLE) LEFT OUTER JOIN _Acc6_ExtDim5518 T4 WITH(REPEATABLEREAD)
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С