2012-03-07 33 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