|
Разделяемый или Исключительный режим блокировки | ☑ | ||
---|---|---|---|---|
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
|
Но еще есть хинт UPDLOCK
v8: блокировки при записи в регистр сведений |
|||
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) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |