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

Откуда: Москва
Сообщений: 10
В нашей конторе с базой работают одновременно до 100 операторов, все они подключаются к БД под своими Windows логинами и постоянно дёргают хранимую процедуру, тело см. ниже. Есть мнение, что если 2-а разных пользователя выполнят "ОДНОВРЕМЕННО" этот запрос:
DECLARE @cv_id int 
BEGIN TRANSACTION 

  UPDATE dta_cv_status with (ROWLOCK, HOLDLOCK)

    -- LOCK selected and store its ID 
    SET inproc = 1, @cv_id = cv_status_id

  WHERE cv_status_id = 
    (
      SELECT top 1
        cv.cv_status_id -- КЛЮЧЕВОЕ ПОЛЕ в dta_cv_status - уникально
      FROM
        dta_customers c with (nolock)
      inner join def_products p with (nolock) on c.product_id = p.product_id
      inner join dta_cv_status cv on c.customer_id = cv.customer_id
      inner join dta_scheduled_calls sc with (nolock) on cv.cv_status_id = sc.cv_status_id
      inner join def_state_priorities sp with (nolock) on cv.priority_id = sp.priority_id
      WHERE c.status_id = 10 and cv.inproc = 0 
         and ( getdate() between sc.begin_time and sc.end_time )
         and call_result_id is null
         and cv.PRIORITY_ID < 85
         and c.product_id in (select product_id from udf_GetProductIDs())
      order by cv.IS_SETUP desc, newid()
    )

COMMIT TRANSACTION
то на выходе они никогда не смогут получить одинаковые @cv_id.
Оказывается это не так.
юзер   @cv_id   время
w229   242213   2005-08-26 08:43:15.670
w236   242213   2005-08-26 08:43:15.657
сегодня утром это случалось 3 раза, 2-а разных пользователя получали одну и ту же запись выполняя вышеупомянутый запрос практически одновременно.

Суть этого запроса в том, что бы из фильтрованного набора получить случайно выбранную запись (не скажу зачем) и сразу "ЗАБЛОКИРОВАТЬ" её (SET inproc = 1), так, что бы другие юзеры не могли выбрать эту запись (WHERE ... cv.inproc = 0) и получить то же самое @cv_id на выходе.

ЧТО ДЕЛАТЬ? КАК ЗАПРЕТИТЬ ПОЛУЧАТЬ ОДНУ И ТУ-ЖЕ ЗАПИСЬ В ТАБЛИЦЕ ГАРАНТИРОВАННО?!!!

--------------------
Ультра ЗУМ - лучше меньше да больше.
26 авг 05, 11:01    [1819652]     Ответить | Цитировать Сообщить модератору
 Re: Конкурентные транзакции и блокировки.  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Не плодите топики. Завели один - продолжайте обсуждение в нем.
26 авг 05, 11:12    [1819699]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить