【问题标题】:Does Sqlserver wrap 'insert into XX select xxxx' as a implicitly TRANSACTIONSqlserver 是否将 'insert into XX select xxxx' 包装为隐式 TRANSACTION
【发布时间】:2014-07-16 22:26:31
【问题描述】:

我有一个存储过程,可以简化为:

INSERT into TABLE1 (column0, column1...) 
  SELECT field0, field1... from TABLE2

我注意到有时 TABLE1 会随机丢失插入中的 SOME 数据,导致此问题的可能性是什么?不是自动包装成'Implicitly TRANSACTION'吗?

注意,SP 是在 .NET C# 代码中调用的,当这个奇怪的问题发生时,我在执行过程中没有发现任何异常。

[编辑0]: 这是我的生产代码中的原始 sql 语句:

CREATE PROCEDURE [dbo].[SaveSomething]
    --The only parameter passed from C# code which is a XML format string.
    @Source nvarchar(max)
AS
BEGIN
--Open that XML with a handle attached
EXEC sp_xml_preparedocument @docHandle OUTPUT, @Source

--turn that XML into a temp table
SELECT
     [PeriodID]
    ,[DESCRIPTION]
    ...
INTO #tmpPeriods
FROM OPENXML(@docHandle, N'/FirstLevelRoot/SecondLevelRoot/LeafNode') 
WITH (PeriodID nvarchar(10) '../@PromotionId',
    [DESCRIPTION] nvarchar(60) '@Reason', 
    ... )

--insert that temp table data to the real useful table. And this is the place we found randomly 
--some condition satisfied rows in tmpPeriods didn't get inserted to TargetTable.
INSERT INTO [dbo].[TargetTable](
     [ID]
    ,[DESCRIPTION]
    ...)
 SELECT
     SourceTable.[PeriodID]
    ,SourceTable.[DESCRIPTION]
    ...
FROM #tmpPeriods as SourceTable
LEFT JOIN [TargetTable]
ON SourceTable.[PeriodID] = TargetTable.ID
WHERE TargetTable.ID IS NULL

我的伙伴使用相同的输入 XML 字符串进行了多次测试,并清空了所有表,但有时 TargetTable 会丢失一些预期的行。

隔离级别默认为“Read Committed”。

【问题讨论】:

  • 我认为我们需要查看非简化版本和调用代码
  • 可能复制到LINK
  • 这可能取决于隔离级别的很多...所以...什么隔离级别?它还很大程度上取决于是什么让您认为数据“丢失”。如果您正在与另一个 spid 比赛,那么各种有趣但有效的场景都是可能的。

标签: sql sql-server database


【解决方案1】:

检查表上的所有触发器。似乎您在 Table1 上有而不是插入触发器。如果您不遵守触发器格式,可能是从插入中插入一些数据。

【讨论】:

    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 2012-01-23
    • 2023-02-09
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多