2014-11-07 3 views
0

Замки Привет всем, Я работаю над замками и пытаюсь их понять.Чтение строк и таблицы для обновления

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

«Общие блокировки (S) разделяемых блокировки удерживаются на данных, считанных по пессимистической модели параллелизма. В то время как общая блокировка проходит другие транзакции могут читать, но не могут изменять заблокированные данных. "

Так что у меня это в одной транзакции.

BEGIN TRAN 

USE AdventureWorks2008R2 

UPDATE Person.Address 
SET AddressLine2 = 'Test Address 2' 
WHERE AddressId = 5 

Теперь в следующей транзакции У меня есть одно и то же

BEGIN TRAN 

USE AdventureWorks2008R2 



UPDATE Person.Address 
SET AddressLine2 = 'gar' 
WHERE AddressId = 5 

--ROLLback 

Который не получает казнены, как я ожидал, но в другой транзакции, у меня есть

select * from AdventureWorks2008R2.Person.Address 

Последнее transction Безразлично И я не уверен, почему. Поскольку он сказал, что я могу ПРОЧТИТЬ данные

Я также посмотрел на блокировку обновления, похоже, что она работает, потому что я не могу обновить строку, если я не прихожу или откатываю трансляцию. ОДНАКО, я не могу выбрать транзакцию. Мой единственный доступный вариант - использовать эксклюзивную блокировку и читать uncommitted? Просто ищет лучший способ блокировки обновляемой строки, но в то же время разрешить чтение этой строки и таблицы. Спасибо.

+0

Используйте уровень изоляции моментальных снимков в своих транзакциях. – knkarthick24

+0

Показать полный код. Вы совершаете и прекращаете транзакцию. Вы знаете, что одно обновление - это транзакция? – Paparazzi

+0

@Blam Я не заканчиваю транзакции, я начинаю переходы и перехожу на другие сеансы и замечаю, что происходит, когда я пытаюсь получить доступ и обновить указанную строку. Протестировать его – Liberace

ответ

1

Это зависит от того, какой режим блокировки на ресурс вынимается в.

Есть три режима блокировки, имеющие значение здесь. Shared (S), Update (U) и Exclusive (X).

Матрица совместимости замок выглядит следующим образом

+---+----+----+---+ 
| | S | U | X | 
+---+----+----+---+ 
| S | ✓ | ✓ | ✘ | 
| U | ✓ | ✘ | ✘ | 
| X | ✘ | ✘ | ✘ | 
+---+----+----+---+ 

т.е. Совместно совместим с другими общими или обновления. Блокировки обновлений совместимы с общими блокировками, но не с другими блокировками обновлений, а эксклюзивные блокировки не совместимы ни с чем.

Первая транзакция получает блокировку U, затем преобразует ее в блокировку X, чтобы фактически выполнить обновление. Вторая транзакция блокируется, потому что блокировки S не совместимы с блокировками X.

Единственный способ разрешить чтение строки при обновлении - использовать read uncommitted или один из уровней изоляции моментальных снимков. Последний возвращает значение «до» строки. Первые могут вернуть «грязные» данные. то есть значение «после», но до того, как оно было зафиксировано.

+0

Мысль сначала там была другая. Только две транзакции так проще. –

Смежные вопросы