Имя: Пароль:
1C
1С v8
Разделяемый или Исключительный режим блокировки
, ,
0 Max Street
 
05.04.13
15:01
Привет. И снова управляемые блокировки:)
Есть 2 варианта режима блокировки: разделяемый и исключительный. Первый используется, когда данные блокируются от записи, второй - от чтения и записи. Вопрос такой: а как же определить, когда нужно заблокировать чтение и запись, в когда только запись
Заранее благодарен
1 andreymongol82
 
05.04.13
15:02
Методологически
2 Max Street
 
05.04.13
15:06
может есть другие варианты?
3 andreymongol82
 
05.04.13
15:10
(2) Какие еще могут быть варианты? Смотрим что нужно сделать. Смотрим что изменится от этих действий. Выбираем.
Кстати, в описании описание 2х режимов блокировке у вас ошибка.
почитайте, хотя бы вот это
http://infostart.ru/public/144750/
4 Max Street
 
05.04.13
15:12
(3) спасибо
5 Spieluhr
 
05.04.13
15:21
(0) от чтения нет блокировки
6 Serginio1
 
05.04.13
15:26
Если хочешь читать с повторным чтением то используй
разделяемый  (REPEATABLEREAD) , если хочешь сначала прочитать, а затем записать то используй исключительный (SERIALIZABLE)
7 Spieluhr
 
05.04.13
15:32
(6) речь об управляемых блокировках, на уровне СУБД - всегда READ COMMITED
8 Serginio1
 
05.04.13
15:40
(7) Есть хинты REPEATABLEREAD и SERIALIZABLE заметь они и пишутся по другому. например
http://www.sql.ru/forum/actualthread.aspx?tid=912872
9 Max Street
 
05.04.13
16:01
сорри, выразился неправильно. речь идет об управляемых транзакционных блокировках.
(5) почему? вот определение: "исключительный режим блокировки подразумевает, что заблокированные данные не могут быть изменены другой транзакцией до окончания текущей транзакции, а также не могут быть прочитаны другой транзакцией, устанавливающей разделяемую блокиовку на эти данные".
я чего-то не понимаю? объясните, пожалуйста
10 rs_trade
 
05.04.13
16:05
(5) исключительная позволяет читать?
11 rs_trade
 
05.04.13
16:06
Хотя да.
12 Spieluhr
 
05.04.13
16:07
(9) все верное понимаете.
механизм работы СУБД таков (речь о работе в транзакции): сначала ставится блокировка, только потом считываются данные

(10) вне транзакции - да
13 Spieluhr
 
05.04.13
16:09
(9) правило очень простое: если в транзакции будет запись каких-то данных, например строк табличной части в набор записей регистра, то сразу ставим на таблицу регистра исключительную по значениям в таб. части
14 rs_trade
 
05.04.13
16:13
(0) А вообще ответ на вопрос содержиться как ни странно в Руководстве разработчика, на странице 556.
15 Serginio1
 
05.04.13
16:14
(0) Например ты хочешь изменить данные. Тебе нужно сначала эти данные прочитать и сделать так, что бы эти данные не изменились.
Если ты применишь к этим данным разделяемый режим, то другая транзакция тоже пишущая с этими позициями будет выполняться до записи 1 транзакции при этом заблокировав на запись. 1 транзакция хочет записать а не может так как вторая держит. Когда придет время писать второй она тоже не сможет так как записи держит 1 транзакция и получается дид лок
16 Max Street
 
05.04.13
16:15
(13) спасибо большое. то, что нужно
следовательно, разделяемый режим блокировки ставится в случае, если я только считываю данные из регистра, но не изменяю их. так?
17 krbIso
 
05.04.13
16:18
(16)Почти, ставится если необходимо обеспечить неизменность считываемых данных до конца транзакции.
18 Max Street
 
05.04.13
16:24
(15) (17) спасибо большое
19 Serginio1
 
05.04.13
16:27
(16) Например ты хочешь посчитать остаток на конкретную дату. Тебе нужно получить остаток на начало периода и движения до даты. Если ты будешь читать в транзакции READ COMMITED (по умолчаниб для управляемых), то уже прочитанные данные могут измениться и ты получишь неправильные данные, что бы этого не было ставится хинт REPEATABLEREAD запрешающий изменение уже прочитанных данных.
20 Max Street
 
05.04.13
16:40
сорри за мою безграммотность, но READ COMMITED и REPEATABLEREAD это соответственно исключительный и разделяемый режимы?
21 krbIso
 
05.04.13
16:43
(20) это уровни изоляции, тип блокировок это S (Shared) и X (ex)
22 krbIso
 
05.04.13
16:45
хинт REPEATABLEREAD указывает что используется данный уровень изоляции, уровень изоляции определяет какая блокировка и на какое время будет установлена.
т.е. в (19) будет изменен уровень изоляции с READ COMMITED на REPEATABLEREAD и блокировка S будет продлена до конца транзакции.
23 Serginio1
 
05.04.13
16:48
Есть уровни изоляции транзакций wiki:Уровень_изолированности_транзакций

Есть табличные указания http://msdn.microsoft.com/ru-ru/library/ms187373.aspx
24 Max Street
 
05.04.13
16:52
спасибо. но эти блокировки используются вроде бы в режиме автоматических блокировок?
25 Serginio1
 
05.04.13
16:57
Автоматический использует уровень изоляции REPEATABL EREAD.
Управляемый использует уровень изоляции READ COMMITED
Для того что бы в этом режиме сделать повторяемое чтение нужно наложить хинт
Select * From Таблица T4 WITH(REPEATABLEREAD)

Если мы хотим применить исключительную блокировку применяем

Select * FROM _Таблица T3 WITH(SERIALIZABLE)
26 Serginio1
 
05.04.13
17:00
27 Serginio1
 
05.04.13
17:02
(24) Без подсказок в управляемом режиме могут возникать ситуации описанные в 15
28 Serginio1
 
05.04.13
17:03
27 Тьфу читать Без подсказок в автоматическом режиме могут возникать ситуации описанные в 15, така как чтение там повторяющееся по умолчанию.
А в управляемых ты сам контролируешь какие записи и как должны блокироваться.
29 Max Street
 
05.04.13
17:04
я что-то запутался совсем. а потому заранее прошу прощения за повторение, поправьте, пожалуйста, меня, если я не прав. Итак, при управляемых транзакционных блокировках испоьзуется режим Исключительный в случаях, когда я читаю данные и затем изменяю/записываю в набор записей. Если мне требуется обеспечить неизменность данных и данные я только читаю, но не изменяю их, я устанавливаю Исключительный режим. А что делать, чтобы избежать ситуации, описанной в (15)?
30 Max Street
 
05.04.13
17:06
* в предпоследней строке вместо Исключительный режим должно быть Разделяемый режим
31 Serginio1
 
05.04.13
17:06
Если ты только читаешь, то используешь разделяемый. При этом режиме не изменятся данные которые ты уже прочитал.
См 19
32 Max Street
 
05.04.13
17:19
спасибо. а как установить хинт REPEATABLEREAD?
33 Serginio1
 
05.04.13
17:20
Разделяемый
34 Serginio1
 
05.04.13
17:21
32 смотри 6
35 Max Street
 
05.04.13
17:24
(34) Спасибо большое.
36 MM
 
05.04.13
19:09
Почему в этой теме столько неверных утверждений. В управляемом режиме используется только уровень изоляции транзакций READ COMMITED (или SNAPSHOT). Характерной чертой которого, является то, что происходит получение только данных завершённых транзакций, после чтения в этом режиме данные легко могут быть изменены любой другой транзакцией. Задержка может быть только при попытке прочитать изменённые, но не зафиксированные данные. Уровень SNAPSHOT (доступен в 8.3) позволяет, прочитать данные на начало транзакции независимо от того изменились ли они другими транзакциями.
Т.о. исключительная блокировка (ставится сервером 1С, сервер СУБД о ней не знает) позволяет не допустить изменения (возможно уже прочитанных) данных до конца транзакции, в течении которой их будут менять.
Чтобы избежать ситуации когда, 1я транзакция прочитала остатки, 2я прочитала - остатков достаточно, 1я записала и закончилась, а затем 2я записала поверх данных первой. В результате получаем минусы в остатках.
37 Serginio1
 
08.04.13
12:28
(36) .. Т.о. исключительная блокировка (ставится сервером 1С, сервер СУБД о ней не знает) ..
Угу
http://www.sql.ru/forum/actualthread.aspx?tid=912872

FROM _AccRg5523 T3 WITH(SERIALIZABLE)
LEFT OUTER JOIN _Acc6_ExtDim5518 T4 WITH(REPEATABLEREAD)