INSERT在一个表中,但它锁定另一个表

时间:2014-01-27 22:00:23

标签: c# sql sql-server transactions deadlock

我现在遇到SQL Server表锁问题。我正在用C#开发。

我的查询在1笔交易下运行。

我将其命名为最简单的识别方式。 “setTransaction”

setTransaction仅适用于“INSERT / UPDATE / DELETE”。

  • 如果我想SELECT。我将使用SqlDataAdapter
  • 如果我想INSERT / UPDATEDELETE,则可以使用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_detail_id

连接到[RESERVATION_THERAPIST]

问题是......

  1. 开始交易。 我想删除“ RESERVATION_DETAIL ”中的记录,其中包含reservation_detail_id = 25
  2. 我选择“ RESERVATION_DETAIL ”中的记录,其中reservation_detail_id = 25

    SELECT * FROM RESERVATION_DETAIL WHERE RESERVATION_DETAIL_ID = 25

  3. 我使用来自2.

    的数据插入表“ LOG

    INSERT INTO LOG(subject,query,log_datetime,user_id,emp_id,old_value)VALUES(      '从RES_DETAIL删除TEMP RESERVE [RES_DETAIL_ID:25]',      '从RESERVATION_DETAIL DELERE RESERVATION_DETAIL_ID = 25'删除,      CURRENT_TIMESTAMP,      1,      NULL,'reservation_detail_id:25 | reservation_id:25 | spa_program_id:-1 | price:| oil:' )

  4. 现在我从“ RESERVATION_DETAIL ”中删除,其中reservation_detail_id = 25

    然后我想删除“ RESERVATION_THERAPIST ”中的记录,其中reservation_detail_id = 25

    从RESERVATION_DETAIL DELETE RESERVATION_DETAIL_ID = 25

  5. 删除
  6. 我选择了一个来自“ RESERVATION_THERAPIST ”的记录,其中reservation_detail_id = 25 < -----我在这里锁定了!!

    SELECT * FROM RESERVATION_THERAPIST WHERE RESERVATION_DETAIL_ID = 25

  7. 我使用5中的数据插入表“ LOG ”。

  8. 最后我会从“ RESERVATION_THERAPIST ”中删除,其中reservation_detaiil_id = 25
  9. 因此执行了上述步骤。 第5步(关于表“ RESERVATION_THERAPIST ”)现在在第3步(关于表“ LOG ”)等待完成,但它从未完成。

    我不明白为什么我插入表 LOG 但它把锁放在表 B !或者这不是锁!?

    在上面的步骤之前有一些查询插入到LOG中没有任何问题。


    现在我可以解决我的问题了。

    查询和步骤已经确定。

    但我忘了表“RESERVATION_DETAIL”有一个触发器,它将在提交DELETE查询后立即运行。

    因此,触发器将自动删除“RESERVATION_THERAPIST”中的记录,此步骤在交易下。

    所以“RESERVATION_THERAPIST”在“DELETE FROM RESERVATION_DETAIL”之后但在“SELECT * FROM RESERVATION_THERAPIST”之前被锁定了

2 个答案:

答案 0 :(得分:1)

在删除之前,有几件事可能导致表被锁定:

  1. 您正在从
  2. 中选择的表中直接删除
  3. 您已为父表启用了级联删除功能,以锁定该表。
  4. 您正在执行操作的另一个表上有一个触发器,该触发器也会从表中删除。
  5. 您正在尝试不按顺序删除表(子表总是先删除,然后是父表。当从父表中删除时,它会检查是否存在子记录。这当然需要比直的更长如果存在的子数据需要更长时间,则删除并将导致回滚。
  6. 同时运行的两个进程之间存在死锁。

答案 1 :(得分:0)

你因为从中删除而锁定了B.