2012-03-07 66 views
2

在处理更新我的数据库的某些函数时,我正在编写一些快速测试,以确保我的函数正确执行。当谈到时间,实际更新数据库,我可以在事务传递给函数,然后将其提交:如何查看SQL事务中的挂起更改?

user.Assignment("assignment value for some column in table", connection, transaction) 
transaction.Commit() 

我很好奇,如果有写一个快速测试,可以验证的方式,该交易将实际在提交之前更新某些行?

(pseudoish代码)

user.Assignment("assignment value for some column in table", connection, transaction) 
If Not transaction["SomeColumn"] = "Expected value for SomeColumn" 
    assert("ColumnName was not going to be updated to the expected value!") 
transaction.Rollback() 
+0

保持您的交易快速/快速,在您进行修改之前/之前进行检查,而不在之后,如果您确实需要这些修改,请使用OUTPUT返回任何更改。 – 2012-03-07 20:24:39

+0

我已经做了所有这些。这实际上不是什么问题,但如果可能的话更是如此。什么是“输出”? – afuzzyllama 2012-03-07 20:32:00

+1

如果你还在交易中,你应该*只能查询它......? – 2012-03-07 20:41:14

回答

3

只要你在连接中,你就可以像往常一样查询数据; 其他调用者将被阻止,但您将有完全访问修改后的数据。

如果您正在使用TransactionScope,这意味着你可以使用任何命令/连接(到同一数据库),只要是创建连接TransactionScope里面 - 它会自动征用到事务(虽然使用相同连接实例更高效 - 避免任何跳转到DTC的风险)。

如果您使用的是DbTransaction,则必须使用相同的连接实例,并记得在针对连接执行的任何命令上适当地设置.Transaction

1

您可以通过使用SSMS with (nolock)选择他们检查值。如果你想从.NET看这个,我相信你可以改变隔离级别并重新查询。

+0

所以,如果我更新与交易相关的某些列,这些值将在提交之前反映在表中? – afuzzyllama 2012-03-07 20:21:43

+0

我不确定这一点,但您可能还需要打开MARS或使用另一个线程来执行此操作一个客户端 – 2012-03-07 20:22:20

+0

@afuzzyllama这就是使用事务的全部原因,你可以将它写入未提交的数据库,你可以通过改变你的隔离级别来读取未提交的事务 - 这是NOLOCK所做的。 – SQLMason 2012-03-07 20:30:26

相关问题