及时commit或rollback就不会死锁,顶多是更新不成功而已

解决方案 »

  1.   

    你举的例子是造成了资源竞争,但如果及时commit或rollback就不会死锁
      

  2.   

    设置锁的时间,如果在一定时间内不能更新就会rollback,再重新开始事务.
      

  3.   

    疑问:更新表加独占锁
    "只有一个事务能够资源的独占锁"
    事务一先-->取得独占锁-->更新A,再-->取得独占锁(冲突,正被事务二锁,更新无法进行)-->更新B,再SUBMIT (释放两个资源的独占锁)
    事务二先-->取得独占锁-->更新B,再-->取得独占锁(冲突,正被事务一锁,更新无法进行)-->新A,再SUBMIT(释放两个资源的独占锁)
    如果两个事务正如楼主假设所说的,不要造成死锁吗?
      

  4.   

    我认为也是会造死锁,因为两个事务都在等待对方释放相关的锁。无法commit完成。
    如何能避免这种情况呢?
      

  5.   

    无法commit你就rollback呀,如果遇到这种情况你不去rollback当然会死锁啦
      

  6.   

    --*關於鎖設table1(A,B,C)
    A B C
    a1 b1 c1
    a2 b2 c2
    a3 b3 c31)排它鎖
    新建兩個連接
    在第一個連接中執行以下語句
    begin tran
    update table1
    set A='aa'
    where B='b2'
    waitfor delay '00:00:30' --等待30秒
    commit tran
    在第二個連接中執行以下語句
    begin tran
    select * from table1
    where B='b2' 
    commit tran若同時執行上述兩個語句,則select查詢必須等待update執行完畢才能執行即要等待30秒2)共用鎖
    在第一個連接中執行以下語句
    begin tran
    select * from table1 holdlock -holdlock人為加鎖
    where B='b2' 
    waitfor delay '00:00:30' --等待30秒
    commit tran在第二個連接中執行以下語句
    begin tran
    select A,C from table1
    where B='b2' 
    update table1
    set A='aa'
    where B='b2' 
    commit tran若同時執行上述兩個語句,則第二個連接中的select查詢可以執行
    而update必須等待第一個連接中的共用鎖結束後才能執行 即要等待30秒3)鎖死
    增設table2(D,E)
    D E
    d1 e1
    d2 e2
    在第一個連接中執行以下語句
    begin tran
    update table1
    set A='aa'
    where B='b2' 
    waitfor delay '00:00:30'
    update table2
    set D='d5'
    where E='e1' 
    commit tran在第二個連接中執行以下語句
    begin tran
    update table2
    set D='d5'
    where E='e1' 
    waitfor delay '00:00:10'
    update table1
    set A='aa'
    where B='b2' 
    commit tran同時執行,系統會檢測出鎖死,並中止進程如果是鎖死可以查一下:
    1:sp_who 或 sp_who2
    2: Select * from sysprocesses where blocked <> 0
    3: 企業管理器->伺服器->管理工具->活動->當前活動 然後把他kill掉
    4:SQL事件探查器,監控一下,看主要是那些處理引起的鎖死.然後做相應的處理.
    用事件探查器new一個trace,監視一下造成你sqlserver停頓的情況最好的辦法還是檢查一下引起鎖的原因,一般是有你的代碼引起的。
    select * from aaa with(nolock) 也許可以解決一點問題。
    nolock:不要發出共用鎖,並且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務或一組在讀取中間回滾的頁面。有可能發生髒讀。僅應用於 SELECT 語句。