2009-12-01 76 views
2

我有一个小问题。请指导我。 我在C#(控制台应用程序)编码。我在代码中调用了2个不同的存储过程。基本上这两个存储过程都访问同一个表。 第一个SP有一个选择查询和一个更新查询。 第二个SP具有单个更新查询。交易存储过程C#

现在我想以事务模式调用这些SP(要么全部成功,要么第二个SP失败回滚第一个SP)。我在我的C#代码中使用了“TransactionScope”,但似乎无法正常工作。即当我停止控制台应用程序时,有时会看到第一个SP被执行,第二个SP失败。

有人可以建议我这个。

Regards,
贾斯汀塞缪尔。

+0

你如何在代码中使用事务范围(使用语句或try/catch)? – Goran 2009-12-01 12:26:00

+0

是的Goran,我使用“using”语句,如: 使用(TransactionScope scope = new TransactionScope()) 封装在try/catch块中。 并且对SP的调用在此范围内 – 2009-12-01 12:36:44

+0

我不明白这是怎么回事。如何在OnExit方法中添加回滚调用?这应确保在停止控制台应用程序并且事务未完成时调用回滚。 – Goran 2009-12-01 12:46:11

回答

4

如果使用TransactionScope,它应该做工精细,但范围必须环绕连接(S)

using(TransactionScope tran = new TransactionScope()) { 
    using(SqlConnection conn = new SqlConnection(cs)) { 
     // either multiple commands on one connection 
     using(SqlCommand cmd = conn.CreateCommand()) { 
     // etc 
     } 
     using(SqlCommand cmd = conn.CreateCommand()) { 
     // etc 
     } 
    } 
    using(SqlConnection conn = new SqlConnection(cs)) { 
     // or a separate connection 
     using(SqlCommand cmd = conn.CreateCommand()) { 
     // etc 
     } 
    } 
    tran.Complete(); 
} 

an edge case where a TransactionScope can fail导致后来的命令来运行没有交易。

或者,对于单个连接使用SqlTransaction,但请记住将事务(从连接)关联到每个命令。

+0

Marc, 我有点困惑。我一次只读一行。做一些使用两个SP的处理。这个单独的行处理在TransactionScope中。如果我在每个事务中写入SqlConnection,它将意味着每个事务中的单独连接。 如果我错了,请提出建议! – 2009-12-01 14:06:33

+0

对不起,我被叫走了 - 会更新。 – 2009-12-01 15:01:51

+0

最后,我不得不在每次交易中创建一个单独的连接。 极好的马克!!! 感谢Marc和Goran的支持。 干杯! – 2009-12-01 15:02:29