【发布时间】:2015-06-24 13:43:56
【问题描述】:
我在我的 C# 代码中使用 TransactionScope。我会尽量简化。
public void ProcessStrings(...)
{
...
using (TransactionScope transactionScope = new TransactionScope())
{
...
if(someCondition)
{
try
{
DeleteSomeStrings(...);
}
catch(Exception ex)
{
//log error
...
throw;
}
}
...
try
{
UpdateSomeStrings(...);
}
catch(Exception ex)
{
//log error
...
throw;
}
...
transactionScope.Complete();
}
...
}
DeleteSomeStrings 和UpdateSomeStrings 方法通过ADO.NET 调用两个存储过程。我还需要在这些存储过程中使用显式事务处理,因为它们也是从其他上下文中调用的:
CREATE PROCEDURE [dbo].[DeleteSomeStrings]
...
--parameter list
...
AS
BEGIN TRY
BEGIN TRAN
...
COMMIT TRAN
END TRY
BEGIN CATCH
...
ROLLBACK
...
RAISERROR(...)
END CATCH
第二个也有类似的结构:
CREATE PROCEDURE [dbo].[UpdateSomeStrings]
...
--parameter list
...
AS
BEGIN TRY
BEGIN TRAN
...
COMMIT TRAN
END TRY
BEGIN CATCH
...
ROLLBACK
...
RAISERROR(...)
END CATCH
问题是当 DeleteSomeStrings 成功而 UpdateSomeStrings 失败时,在 DeleteSomeStrings 中处理的数据仍然被提交。在这种情况下,看起来 TransactionScope 被忽略了。我希望一切都会回滚。这是正常行为吗?如果是,为什么?
【问题讨论】:
-
在执行第一个存储过程时,尝试使用
rowsAffected = cmd.ExecuteNonQuery();如果rowsAffexted 为零,则执行第二个SP 没有意义
标签: c# .net sql-server tsql transactions