1.場景
1) 測試表Tbsf_TempDataNo 表結構特點:
Tbsf_TempDataNo (ID,tblName,DataNo,createTime)
無索引,無主鍵。
2) A用戶進行如下操作:
begin tran
insert Tbsf_TempDataNo values ('tbl_Duty_Form','200904140001',getdate())
................. --(M1)
commit tran
3) B用戶同時執行如下操作:
begin tran
Delete From Tbsf_TempDataNo
Where tblName='Test' AND DateDiff(hour,createTime,getdate())>4 --(M2)
commit tran
2.問題
1)假設A先執行到(M1)處,然后B執行M2操作;此時由于A執行了新增操作,B的刪除操作必須等待A的執行提交完之后才能執行,如果A操作時間過長則會導致B長時間等待。
3.解決辦法:
1) 給Tbsf_TempDataNo 加索引(tblName,createTime)(要注意索引的字段順序);如此B在執行M2操作時會根據索引來找到符合條件的數據行,如果M2操作的數據中沒有A用戶的未提交的臟數據的話就可以順利先執行完成,而如果有A用戶未提交的數據則必須等待。
這種方式,通過盡量精確的條件、索引篩選將可以降低事務等待的機率。