2014-01-27 5 views
-3

У меня возникла проблема с блокировкой таблицы SQL Server. Я развиваюсь на C#.INSERT в одной таблице, но она блокирует другую таблицу

Мои запросы выполняются под 1 транзакцией.

Я называю это самым простым способом распознавания. "setTransaction"

setTransaction предназначен для "INSERT/UPDATE/DELETE".

  • если я хочу SELECT. Я буду использовать SqlDataAdapter.
  • Если я хочу сделать INSERT/UPDATE или DELETE, пришло время использовать setTransaction.

здесь таблица структура каждого ...

[LOG](
    [log_id] [int] IDENTITY(1,1) NOT NULL, 
    [subject] [text] NOT NULL, 
    [query] [text] NOT NULL, 
    [log_datetime] [datetime] NOT NULL, 
    [user_id] [int] NOT NULL, 
    [emp_id] [int] NULL, 
    [old_value] [text] NULL 
) 

[RESERVATION_DETAIL](
    [**reservation_detail_id**] [int] IDENTITY(1,1) NOT NULL, 
    [reservation_id] [int] NOT NULL, 
    [spa_program_id] [int] NULL, 
    [price] [int] NULL, 
    [oil] [int] NULL 
) 

[RESERVATION_THERAPIST](
    [reservation_therapist_id] [int] IDENTITY(1,1) NOT NULL, 
    [**reservation_detail_id**] [int] NOT NULL, 
    [therapist_id] [int] NOT NULL, 
    [hours] [int] NULL, 
    [mins] [int] NULL 
) 

[LOG] работает независимо друг от друга. [RESERVATION_DETAIL] подключены к [RESERVATION_THERAPIST] с помощью reservation_detail_id

Проблема заключается в ....

  1. BEGIN TRANSACTION. Я хочу удалить запись из "RESERVATION_DETAIL" с reservation_detail_id = 25
  2. Я выбрать запись из "RESERVATION_DETAIL" с reservation_detail_id = 25

    SELECT * FROM RESERVATION_DETAIL WHERE RESERVATION_DETAIL_ID = 25

  3. вставить в таблицу "LOG" с данными из 2.

    ВСТАВИТЬ в журнал (при условии, запрос, log_datetime, идентификатор_пользователя, emp_id, old_value) ЗНАЧЕНИЯ ( 'DELETE TEMP запас из RES_DETAIL [RES_DETAIL_ID: 25]', 'DELETE FROM RESERVATION_DETAIL ГДЕ RESERVATION_DETAIL_ID = 25', CURRENT_TIMESTAMP, 1 , NULL, 'reservation_detail_id: 25 | reservation_id: 25 | spa_program_id: -1 | цена: | нефть:' )

  4. теперь удалить из "RESERVATION_DETAIL", где reservation_detail_id = 25

    Тогда я хочу для удаления записи из «R ESERVATION_THERAPIST "с reservation_detail_id = 25

    DELETE FROM WHERE RESERVATION_DETAIL RESERVATION_DETAIL_ID = 25

  5. Я выбрать запись из" RESERVATION_THERAPIST "с reservation_detail_id = 25 < ----- Я ПОЛУЧИЛА ЗАМОК ЗДЕСЬ !!

    SELECT * FROM RESERVATION_THERAPIST WHERE RESERVATION_DETAIL_ID = 25

  6. вставить в таблицу "LOG" с данными из 5.

  7. Наконец я буду удалять из "RESERVATION_THERAPIST", где reservation_detaiil_id = 25

После этого были выполнены первые шаги. Шаг 5 (который находится около таблицы «RESERVATION_THERAPIST») теперь подождать на шаге 3 (около таблицы «LOG») до конца, но он так и не завершился.

Я не понимаю, почему я вставить в таблицу LOG но поставить замок на стол B!? или это не замок!

Перед тем, как это было сделано, возникли вопросы, которые вставляются в LOG без каких-либо проблем.


Теперь я могу решить свою проблему.

Запросы и шаги уже выполнены.

Но я забыл, что таблица «RESERVATION_DETAIL» имеет триггер, который будет запускаться сразу после запроса DELETE.

Таким образом, триггер будет автоматически удален, чтобы удалить запись в «RESERVATION_THERAPIST», и этот шаг находится под транзакцией.

Так "RESERVATION_THERAPIST" был заперт после "DELETE FROM RESERVATION_DETAIL", но прежде, чем я "SELECT * FROM RESERVATION_THERAPIST"

+10

ПОЧЕМУ МЫ орать? – swasheck

+1

Как насчет дать структуру таблицы в ваш пост и точный sql? –

+0

Извините, что: P –

ответ

1

Несколько вещей могут привести к таблице будет заблокирована до тех пор, удаление не через:

  1. Вы непосредственно удаляемого из таблицы, которую вы пытаетесь выбрать из
  2. Вы каскадное удаления включены для родителей таблицу к той, которая заблокирована.
  3. У вас есть триггер на другой таблице, из которого вы делаете действие, которое также удаляется из таблицы.
  4. Вы пытаетесь удалить таблицы из строя (дочерняя таблица всегда удаляется сначала, а затем родительские. При удалении из родительской таблицы она проверяет, существуют ли дочерние записи. Это, конечно, занимает больше времени, чем прямой удалять и вызовет откат, если существует данные ребенка, который занимает больше времени, тем не менее.
  5. вы затор между двумя процессом, запущенным одновременно.
+0

Я нашел ответ в то же самое время, когда вы разместили его. Но моя репутация меньше 10, поэтому я не могу ответить на свой вопрос. Тогда я принимаю твое :) –

0

Вы получили блокировку B, потому что вы удалили из него.

+0

Спасибо за ответ. Я редактировал свой вопрос и помещал в него имя реальной таблицы. :) –

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