Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 хочеться странного  [new]
PsM
Member

Откуда:
Сообщений: 72
Есть табличка, в ней есть поле State и ID
периодически будет вызываться хранимая процедура
которая обрабатывает одну строку из таблицы c определенным State и меняеться State на другой.
Проблемка в том что практически одновременно может запуститься до 30 таких процедур, как сделать что бы они не могли "схватить" одни и теже строки?
Идеальным решением было бы одновременное изменение State и получение ID.
Что можете посоветовать?
Как такие проблемки обычно решаються?
21 июн 05, 15:56    [1637204]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
Роман Дынник
Member

Откуда:
Сообщений: 3324

а транзакционный механизм вам не знаком?


Posted via ActualForum NNTP Server 1.2

21 июн 05, 15:59    [1637225]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
PsM
Member

Откуда:
Сообщений: 72
Не вижу как его можно применить
21 июн 05, 16:21    [1637340]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
Роман Дынник
Member

Откуда:
Сообщений: 3324

Isolation Level - READ COMMITTED


Posted via ActualForum NNTP Server 1.2

21 июн 05, 16:26    [1637368]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
Glory
Member

Откуда:
Сообщений: 104760
set rowcount 1
declare @id int
update mytable set @id=id, status = 'X' where status = 'Y'
set rowcount 0
21 июн 05, 16:32    [1637391]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
PsM
Member

Откуда:
Сообщений: 72
Извините меня, за глупые вопросы.

Но я что то не могу понять как READ COMMITTED
может помочь не дать двум процедурам выбрать одну и туже строчку?
обьясните мне пожалуйста.
21 июн 05, 16:34    [1637401]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
PsM
Member

Откуда:
Сообщений: 72
Glory
set rowcount 1
declare @id int
update mytable set @id=id, status = 'X' where status = 'Y'
set rowcount 0

Все гениально и просто :)
Спасибо, это именно то что нужно,
Я насколько понимаю
set rowcount 1
для того что бы апдейт обработал на одну строчку ?
21 июн 05, 16:40    [1637424]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
Glory
Member

Откуда:
Сообщений: 104760
PsM
Я насколько понимаю
set rowcount 1
для того что бы апдейт обработал на одну строчку ?

Да.
21 июн 05, 16:43    [1637443]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
Роман Дынник
Member

Откуда:
Сообщений: 3324

read commit не дает во 2-ом паралельном запросе приведенном Glory захватить
неподтвертвержденную запись обрабатываемую 1-ым запросом.

можно и так:
update mytable set status = 'X' where id in(select top 1 id from mytable 
where where status = 'Y')



Posted via ActualForum NNTP Server 1.2

21 июн 05, 16:58    [1637517]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
ChA
Member

Откуда: Москва
Сообщений: 11128
Роман Дынник

read commit не дает во 2-ом паралельном запросе приведенном Glory захватить
неподтвертвержденную запись обрабатываемую 1-ым запросом.
Расшифруйте, пожалуйста, если несложно, а то смысл фразы все время теряется...
21 июн 05, 17:06    [1637563]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
Роман Дынник
Member

Откуда:
Сообщений: 3324


>>>Расшифруйте, пожалуйста, если несложно, а то смысл фразы все время
>>>теряется
На изменяемые 1-ой транзакцией данные накладывается блокировка, запрещающая
модификацию и чтение данных другой транзакцией.


Posted via ActualForum NNTP Server 1.2

21 июн 05, 17:17    [1637623]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
ChA
Member

Откуда: Москва
Сообщений: 11128
Роман Дынник

На изменяемые 1-ой транзакцией данные накладывается блокировка, запрещающая
модификацию и чтение данных другой транзакцией.
Эта блокировка накладывается до конца транзакции, независимо от уровня изоляции. Поэтому фраза
Роман Дынник
read commit не дает во 2-ом паралельном запросе приведенном Glory захватить
неподтвертвержденную запись обрабатываемую 1-ым запросом.
смысла так и не обрела. Если бы во втором соединении выполнялось только чтение в READ UNCOMMITTED, возможно, этот смысл бы появился, но, увы, там тоже делается попытка модификации, которая не может быть осуществлена, пока не закончится транзакция в первом соединении. И это не имеет ни малейшего отношения к READ COMMITTED...
21 июн 05, 17:44    [1637792]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
Роман Дынник
Member

Откуда:
Сообщений: 3324


"ChA", но после первой транзакции Status то будет уже изменен.


Posted via ActualForum NNTP Server 1.2

21 июн 05, 17:53    [1637843]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
Роман Дынник
Member

Откуда:
Сообщений: 3324

при read uncommited данные измененные первой транзакцией могут быть
прочитаны другой (грязное чтение).


Posted via ActualForum NNTP Server 1.2

21 июн 05, 17:58    [1637871]     Ответить | Цитировать Сообщить модератору
 Re: хочеться странного  [new]
ChA
Member

Откуда: Москва
Сообщений: 11128
Роман Дынник
"ChA", но после первой транзакции Status то будет уже изменен.
Ради Бога, и что ? Какое отношение имеет уровень изоляции READ COMMITTED к коду Glory, пояснить можете ? И как изменится поведение сервера при выполнении упомянутого кода, если уровень изоляции будет другим ?
Роман Дынник
при read uncommited данные измененные первой транзакцией могут быть
прочитаны другой (грязное чтение)
Там нет чтения, во всех соединениях попытки изменения...
21 июн 05, 18:04    [1637904]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить