【发布时间】: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