Имя: Пароль:
1C
1С v8
Взаимоблокировка в SQL сервер 2008 R2
0 Habist
 
06.03.12
17:48
Пытался смоделировать дедлок в 1С в разных режимах и разными способами, максимум что удалось сделать - отловить в ЦУПЕ и профайлере таймауты. Почитал на сайте MSDN - оказалось в 2008 сервере понятие дедлока есть только в теории, на практике монитор блокировок при обнаружении конфликта, выбирает "жертву" взаимоблокировки и откатывает эту транзакцию, вторая транзакция завершается нормально.
Получается что дедлоки - это невоспроизводимая ситуация или я не так что-то понял? Зачем тогда в профайлере и ЦУПЕ различные инструменты по обнаружению и анализу взаимоблокировок остались?
1 Живой Ископаемый
 
06.03.12
17:50
Наверное потому что в8 работает не только с МС СКЛ?
2 Habist
 
06.03.12
17:57
хм... да, не так сформулировал вопрос. Про 2008 SQL я правильно понял?
3 упс
 
06.03.12
17:58
нет, не правильно. взаимоблокировка никуда не девается, а разруливать их любой sql server умеет
4 thargon
 
06.03.12
17:59
"на практике монитор блокировок при обнаружении конфликта, выбирает "жертву" взаимоблокировки и откатывает эту транзакцию, вторая транзакция завершается нормально" - такое поведение имхо еще с 2000го сервера.
5 Habist
 
06.03.12
18:01
тогда какого ЦУП и профайлер показывают таймаут а не дедлок
6 rs_trade
 
06.03.12
18:01
(0) потому что взаимоблокировки это не нормально. они дольше держат ресурсы заблокированными. а откат транзакции это тоже не нужная нагрузка на скуль сервер.
7 упс
 
06.03.12
18:06
(5) потому что на сервере не происходит взаимоблокировки, а отваливается ожидающая сессия по таймауту
8 упс
 
06.03.12
18:06
+(7) когда вы видите "таймаут"
9 Habist
 
06.03.12
18:07
а кто-нибудь пытался смоделировать дедлок и увиедть его в ЦУПе? Запускал одновременно 20 пользователей через тест-центр, и все выполняли один код с повышением уровня изоляции транзакции по взаимопересекающимся ресурсам - результат : превышение ожидания времени блокировки в транзакции, т.е. таймаут. Вообще сложилось впечатление, что для моделирования дедлока нужно очень сильно нагрузить сервер, просто так двумя десятками запросами не получится.
10 Господин ПЖ
 
06.03.12
18:07
(0) ты чего там навоспроизводил? заставил ждать вторую транзакцию и ее выкинуло по тайм-ауту? это не дедлок вообще-то
11 Habist
 
06.03.12
18:09
(10) нет, вторая ждет когда первая освободиться, а первая когда вторая. Классический пример
12 rs_trade
 
06.03.12
18:10
(9) дедлок это определенная ситуация. при чем тут нагрузки вообще?
13 Habist
 
06.03.12
18:13
(12) А вот попробуйте воссоздать искусственно эту ситуацию, с двумя пользователями. Ситуация-то создается, но проблема в том, что сервер 2008 не регистрирует дедлок в профайлере, а считает это таймаутом
14 rs_trade
 
06.03.12
18:15
(13)а зачем мне создавать эту ситуацию? какой в этом смысл? ну создал, ну посмотрел, да дедлок. дальше что?
15 Господин ПЖ
 
06.03.12
18:15
(11) он бы тогда и написал "дед-лок"
16 Habist
 
06.03.12
18:16
(15) а вот нифига. вот цитата с MSDN:Unlike Microsoft SQL Server, Microsoft SQL Server Compact 3.5 does not have deadlock detection. In SQL Server Compact 3.5, a deadlock is handled by using the lock time-out. If a transaction attempts to place a lock on a resource but cannot do so within the lock time-out, an error occurs. The lock time-out ensures that a transaction does not wait indefinitely for a resource held by another transaction. You can modify the lock time-out. For more information, see Lock Time-out.

If two transactions are involved in a deadlock, one of the transactions waiting for the resource times out and an error occurs. The transaction that times out is still active; it is not committed or rolled back. The other transaction then acquires the lock it requires and continues.

For more information, see SQL Server Books Online.
17 Habist
 
06.03.12
18:17
я так понял это спицифика 2008, 2005 бы написал deadlock
18 Habist
 
06.03.12
18:21
(14) чтобы было понятно, просто в ЦУПе захотелось отловить взаимоблокировки, на рабочих базах нет, да и не разрешают, вот и попробовал сам смоделировать, второй день мучаюсь, в итоге одни таймауты
19 Господин ПЖ
 
06.03.12
18:25
(16) а причем тут Server Compact 3.5? или у тебя на ней база крутится? О_о
20 упс
 
06.03.12
18:39
(0) В SSMS выполнить:
CREATE TABLE ##t1 (a int, b int, c int)
INSERT INTO ##t1
SELECT 1,2,3
UNION SELECT 2,3,4
UNION SELECT 3,4,5

CREATE TABLE ##t2 (a int, b int, c int)
INSERT INTO ##t2
SELECT 1,2,3
UNION SELECT 2,3,4
UNION SELECT 3,4,5

В новой сессии (1) выполнить:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
UPDATE ##t2
SET c = 2


В новой сессии (2) выполнить:
BEGIN TRANSACTION
UPDATE ##t1
SET c=1

В сессии (1) выполнить:

SELECT *
FROM ##t2

В сессии (2) выполнить:

SELECT *
FROM ##t1

В одной из сессий насладиться:
Msg 1205, Level 13, State 56, Line 2
Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Как смоделировать в 1С думай сам
21 упс
 
06.03.12
18:41
(20) не все скопировал:

В новой сессии (2) выполнить:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
UPDATE ##t1
SET c=1
22 rs_trade
 
07.03.12
01:01
(18) про сифилис и триппер я думаю ты тоже слышал. не хочешь отловить их что бы понять что это такое? )))
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший