none
資料庫連動(connection和transacacton)的問題 RRS feed

  • 問題

  • 各位大大好~~

     

    a

    b

    c

     

     

     

     

     

    d

     

     

    d

     

     

     

     

     

     

    這是一個tree

    欄位父和欄位子在資料表為pk

    資料表的資料記錄如以下所列

    a-b

    select count(*) from aaa where P='a' and C='b'

    if count>0 update a-b

    else insert a-b 

    b-c

    select count(*) from aaa where P='b' and C='c'

    if count>0 update b-c

    else insert b-c 

    b-d

    select count(*) from aaa where P='b' and C='d'

    if count>0 update b-d

    else insert b-d

     

    a-d

    select count(*) from aaa where P='c' and C='c1'

    if count>0 update c-c1

    else insert a-d =>發生錯誤

     

    使用tracaction, 要將a這個tree寫進去

    可寫到第二個a-d就發生select的conn和trancansaction的conn blk而造成逾時錯誤,

    spid ecid status loginame hostname blk dbname cmd
    54 0 sleeping                       sa CASPC10                                                                                                                          56 dw_WFerp SELECT          
     

    發現只要selectinsert都設在同一個conn && 同個transacaction就不會發生錯誤

    可若insert在同一個conn && 同一個trans

    select是獨立一個conn

    就會發生錯誤

    錯誤的原因是什麼呢?

     

    謝謝大大解惑~~

    2007年7月4日 上午 08:53

所有回覆

  • 前面不就已經跟你講過是鎖定的問題了嗎?

    當 connection A 把門關起來,connection B 怎麼會進的去呢?

     

    設在同一個連線是因為在同一個連線中不會被鎖定。

    預設的鎖定行為是 READ COMMITED,也就是在交易被認可之前,其他的連線都不准讀這個交易中被鎖定的資料。

     

    你可以試著修改交易的隔離層級為 READ UNCOMMITED

    但如果用這個模式,connection B 讀到修改後的資料但 connection A 撤銷了交易認可,

    那等於 connection B 讀到的是錯誤的資料。

     

    並行作業和鎖定的資訊在 SQL Server Books Online 都找的到,

    更詳細的技術說明則可以去書店找資料庫原理的書來看。

     

     

    2007年7月4日 上午 09:10
    版主
  • 大大你好~~

    測試目地的IsolationLevel將預設的READ COMMITED改為ReadUncommitted =>依舊發生blk

    測試目地的IsolationLevel將預設的READ COMMITED改為Serializable =>依舊發生blk

    測試目地的IsolationLevel將預設的READ COMMITED改為RepeatableRead =>依舊發生blk

     

    還是造成lock ,導致逾時的錯誤...@@

     

    2007年7月4日 上午 10:03
  • 你設定的 Isolation Level 是 "Transaction" 所在的 connection 還是 "SELECT" 所在的 connection?

     

    另外,如果這個方法不行,就不要一直死抱著這個方法,浪費時間。

    以後有時間再來研究也可以。

     

    我前面也說過了,避免在同一個作業中使用多個 Connection。

    2007年7月4日 上午 10:41
    版主
  • 大大你好~~

    確定是transacaction的connection沒錯

    csConn.TranForERP = csConn.objConnTran_ERP.BeginTransaction(IsolationLevel.ReadUncommitted);

     

    其實己經有著手在將connection都改寫成一個就好,

    但仍對這部分感到好奇, 所以..同步進行改寫與研究它,

    希望各位大大幫忙提供方向, 找出會blk的原因

     

    謝謝大大~~

    2007年7月4日 上午 10:49