none
關於資料庫transaction RRS feed

  • 問題

  • a b c c1
          c2
        d  
      b1 c c1
          c2
        f  

    這是一個tree

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

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

    a-b

    b-c

    c-c1

    c-c2

    b-d

    b1-c

    c-c1

    c-c2

    b1-f

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

    可寫到第二個c-c1就發生錯誤,

    因為在第一個c-c1時判斷資料庫無c-c1,於是新增

    可第二個因行為transaction所以第一個c-c1還沒新增至資料表,所以第二個c-c1又新增,造成錯誤

     

    請教各位大大,有沒有什麼方法可以解決呢

    謝謝大大~~

     

    2007年6月21日 上午 08:22

解答

  • 要看你實際上的程式是怎麼寫的

    重點在於所有與資料庫的連動

    都要再同一個SQL連線並且在同一個SQLTranaction下

     

     

    2007年6月27日 上午 02:29

所有回覆

  • 可寫到第二個c-c1就發生錯誤,  ??可寫到??

    可第二個因行為transaction所以第一個c-c1還沒新增至資料表,所以第二個c-c1又新增,造成錯誤 ??可第二個??

    看不太懂你的問題,有程式碼供參考嗎?

    2007年6月21日 上午 10:38
  • 這是一個tree

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

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

    Code Snippet

    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 

    c-c1

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

    if count>0 update c-c1

    else insert c-c1 

    c-c2

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

    if count>0 update c-c2

    else insert c-c2

    b-d

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

    if count>0 update b-d

    else insert b-d

    b1-c

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

    if count>0 update b1-c

    else insert b1-c

    c-c1

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

    if count>0 update c-c1 =>因為tranction所以上面那筆資料還沒insert到資料表

    else insert c-c1 =>發生錯誤

    c-c2

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

    if count>0 update c-c2

    else insert c-c2

    b1-f

    select count(*) from aaa where P='b1' and C='f'

    if count>0 update b1-f

    else insert b1-f

     

     

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

    可寫到第二個c-c1就發生錯誤,

    因為在第一個c-c1時判斷資料庫無c-c1,於是新增

    可第二個因行為transaction所以第一個c-c1還沒新增至資料表,所以第二個c-c1又新增,造成錯誤

     

    請教各位大大,有沒有什麼方法可以解決呢

    謝謝大大~~

    2007年6月22日 上午 01:06
  • 請問您是否有將所有的動作都設定在同一個transaction下

    如果有的話是不會有你說的情況

     

     

    2007年6月23日 上午 03:45
  • 您可能要去查看看您的transaction有沒有發生作用。

     

    2007年6月23日 上午 03:56
    版主
  • 大大~~

    @@怎麼看transaction有沒有發生作用

    2007年6月27日 上午 01:51
  • 要看你實際上的程式是怎麼寫的

    重點在於所有與資料庫的連動

    都要再同一個SQL連線並且在同一個SQLTranaction下

     

     

    2007年6月27日 上午 02:29
  • 你那些所有的Insert,Update,Delete是否都是用同一個Transaction?

    如果是同一個,照理來說,是不會有問題的.

     

    還有,你所說的錯誤,應該有錯誤訊息吧,請問錯誤訊息是什麼?

    2007年6月27日 下午 04:07
  • 大大好~~

    錯誤訊息如下:

    Type: System.Data.SqlClient.SqlException; Message: 已超過連接逾時的設定。在作業完成之前超過逾時等待的時間,或者是伺服器未回應。

    另外請教大大

    若對三個table做異動, 是不是該用三個sqlcommand來處理呢?還是用一個就可以了?

     

    謝謝大大~~

     

     

    2007年6月28日 上午 01:12
  • 在超過連接逾時發生前一刻,你有看一下,是否Table被Lock住了? (目前判斷,是被Lock住了)

    sqlcommand用一個也可以. Transaction一定要同一個,才不會有未Commit的資料讀不到的問題.

    請問你用了幾個Transaction? 感覺起來,你好像不只用了一個.

    2007年6月28日 下午 04:27
  • 大大你好~~

    只用了一個trancaction

    程式碼如下連結

    麻煩各位大大了...謝謝大大們的幫忙

    http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=1763773&SiteID=14

    2007年7月3日 上午 06:58
  • trancaction

    用沒有trancactionconnselect aa

    trancactionconninsert aa

    用沒有trancactionconnselect aa

    不知為何?就造成沒有trancactionconn和有trancactionconn互相lock(或是阻擋)(查詢sp_whoblk,不曉得這樣是lock或阻擋)

    然後就出現錯誤訊息

     

    在發現是相同conn blk造成conn逾時的錯誤訊息

    再回來看MattLee大大回覆:

    需在同一個conn && 同一個trans; 將所有的動作都設定在同一個transaction下

    才發現 MattLee大大的意思是指select目地和insert目地都要在同一個conn && 同一個trans

    而之前我只有insert在同一個conn && 同一個trans

    select是獨立一個conn

     

    不過這樣就使人好奇

    為何不同一個conn會造成這樣的現象呢

     

    謝謝各位大大的幫忙^^

    2007年7月4日 上午 08:02
  • 不過這樣就使人好奇

    為何不同一個conn會造成這樣的現象呢

     

    那可能你要看一下Transaction是用來做什麼的.

    這個是SQL的說明,或許你看了,就能大概知道Transaction是在做什麼的.

    http://technet.microsoft.com/zh-tw/library/ms188929.aspx

     

    2007年7月6日 上午 04:00