 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
jms7275
註冊時間: 2005-01-08 文章: 65
第 1 樓
|
發表於: 星期三 二月 23, 2005 5:52 am 文章主題: 請問關於更新衝突的概念 |
|
|
如果一個系統有三個table,彼此獨立沒有關連
是否就不會有更新衝突的問題?
因為系統不是會鎖定該筆紀錄(bufferMode=3),直到解除鎖定
才會讓下一位使用者鎖定該筆資料
那應該就不會有同時存取同一筆資料,造成更新衝突的問題?
還是說有其他(除了同時存取同一筆資料外,
但照理系統自動鎖定該筆紀錄,應該不會發生)比較複雜的更新衝突的情況?
謝謝 |
|
回頂端 |
|
 |
小賴
註冊時間: 2004-12-27 文章: 476
第 2 樓
|
發表於: 星期三 二月 23, 2005 9:31 am 文章主題: |
|
|
早期使用CLIPPER;檔案鎖定都是自行處理, 那時最
怕的算是"死結"問題 : 甲乙二人執行的程式必須分
別使用AB二個資料表格, 甲之程式先鎖定A表格, 接著
必須鎖定B表格, 但此時B表格卻已被乙之程式鎖定
更糟的是, 乙之程式也同時要去鎖定已被甲鎖定之
資料表格A, 如此二方程式必定永遠處於WAIT狀態;
現在使用FOXPRO, 不知是否也可能發生死結情況 ? |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 3 樓
|
發表於: 星期三 二月 23, 2005 10:36 am 文章主題: |
|
|
會嗎? , 這是流程問題, 不是程式問題, 你的例子應在改成在鎖定a後要一直鎖到b處理完後再解鎖, 就不會有死結發生. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
bin1x
註冊時間: 2004-08-27 文章: 462
第 4 樓
|
發表於: 星期三 二月 23, 2005 10:48 am 文章主題: |
|
|
我覺得死結情況
像是開玩笑
應說是程式寫法不周延造成"死結"
而且系統程式也有"死結"的情況,資源互相取用
所以"死結"應是一種概念
比如產生一個檔案(abc.dbf)在server端,以前在dos環境下寫的
而別支程式也產生了(abc.dbf),在同個時間下,如果別支程式正在使用中
開共用的話,也許檔案格式會不同(這算不算一種死結),
且lock 可分成flock , rlock
flock 的情況很少發生,因為要存資料時才會寫入,時間是很短暫的
rlock 的情況之前在寫的時候,多人同時使用一筆資料的情況
不多,除非是故意的,所以就只好先來的先鎖定,處理完之後在放開
(office 對檔案的處理不是這樣嗎)
而且,似乎對於帳的處理,在未過帳前(採用批次過帳),先計算好此次交易的結果(但未過帳)
而即時處理更不用說了,同時存取的話,就等了
反倒是系統資源的硬體方面,因為共用的情況,"死結"的情況會比應用系統來的多吧 |
|
回頂端 |
|
 |
jms7275
註冊時間: 2005-01-08 文章: 65
第 5 樓
|
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 6 樓
|
發表於: 星期三 二月 23, 2005 3:58 pm 文章主題: |
|
|
感到有點奇怪....
要造成deadlock的話,應該是
互相擁有對方想要的資源的一部分,而且"一定要資源到齊才能運作",所以才會等待對方釋出手中的資源.
個別lock個別所需的table不會造成deadlock,
個別lock A,B,C 三個table,沒有deadlock問題.
而是三個行程各自抓了A,B,C 三個table其中之一,而且這個行程又必須A,B,C 三個table 同時鎖定才能執行.
除非這三個行程能"適時"放開自己的手,讓其他行程有機會同時獲得A,B,C 三個table,
否則將沒有任何一個行程能夠執行.
"有失去,才有獲得",
只是一直嘗試lock,而沒有人放手,還是沒用的.
一般教授"作業系統"的課程都會提到,
如果沒有人願意放手,就由os自己挑選一個"犧牲者",
強迫讓他放手.
這點,在sql server 上也是如此.
其實再windows 操作有時也是會叫出"工作管理員(task manager)"硬生生刪除某個程式,
而讓其他程式能順利執行,
也是相同的道理.
去除掉"一定要資源到齊才能運作"的條件,
例如一次只鎖住一個table執行,
當然就沒有機會造成deadlock. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
小賴
註冊時間: 2004-12-27 文章: 476
第 7 樓
|
發表於: 星期三 二月 23, 2005 4:42 pm 文章主題: |
|
|
"死結" 不應被解釋為開玩笑之問題 !
garfield 兄認為程式流程問題, 在下也只作部份認同,
沒錯 ! "流程" 可導至死結, 你可利用流程避開它, 但是
他還是存在, 這是系統上的問題, 邏輯上它就是必然存在
就好像大家認為車禍是人的問題 ? 車子的問題, 還是路的問題呢 ?
與其認為以上的問題倒不如說:只要有道路,在現行的
交通工具下就有車禍發生的問題.
還有garfield兄您提到的避開死結方式,我卻認為它是導至死結的主因;
沒錯!就是因為將a鎖定到b處理完,才可能發生死結(除非先將ab都鎖定成功時
再作異動;直到ab都異動完成再解鎖,這樣可確保其他程式不會有機會去鎖定a或b,
不過這在資源考慮上,效率又不好, a 之異動可能秏時,a 未處理先鎖b並不理想)
試想f1, f2二支程序, 它們的處理流程如下:
f1 : f2 :
-------------------------------------------------------------------------------
1. 鎖定a 鎖定b
2. 異動a表格 異動b表格
3. 鎖定b直到鎖定成功 鎖定a直到鎖定成功
4. b表格作異動處理 a表格作異動處理
5. a,b解鎖 a,b解鎖
當二支程序同時運作時將發生何種情況 ? 是否有可能f1, f2階只
能執行到第3的流程而處於wait狀態(互相等待對方解鎖)? |
|
回頂端 |
|
 |
小賴
註冊時間: 2004-12-27 文章: 476
第 8 樓
|
發表於: 星期三 二月 23, 2005 4:49 pm 文章主題: |
|
|
以上流程有點亂所以重送
"死結" 不應被解釋為開玩笑之問題 !
garfield 兄認為程式流程問題, 在下也只作部份認同,
沒錯 ! "流程" 可導至死結, 你可利用流程避開它, 但是
他還是存在, 這是系統上的問題, 邏輯上它就是必然存在
就好像大家認為車禍是人的問題 ? 車子的問題, 還是路的問題呢 ?
與其認為以上的問題倒不如說:只要有道路,在現行的
交通工具下就有車禍發生的問題.
還有garfield兄您提到的避開死結方式,我卻認為它是導至死結的主因;
沒錯!就是因為將a鎖定到b處理完,才可能發生死結(除非先將ab都鎖定成功時
再作異動;直到ab都異動完成再解鎖,這樣可確保其他程式不會有機會去鎖定a或b,
不過這在資源考慮上,效率又不好, a 之異動可能秏時,a 未處理先鎖b並不理想)
試想f1, f2二支程序, 它們的處理流程如下:
f1 :
-------------------------------------
1. 鎖定a
2. 異動a表格
3. 鎖定b直到鎖定成功
4. b表格作異動處理
5. a,b解鎖
f2 :
--------------------------------------
1. 鎖定b
2. 異動b表格
3. 鎖定a直到鎖定成功
4. a表格作異動處理
5. a,b解鎖
當二支程序同時運作時將發生何種情況 ? 是否有可能f1, f2階只
能執行到第3的流程而處於wait狀態(互相等待對方解鎖)? |
|
回頂端 |
|
 |
小賴
註冊時間: 2004-12-27 文章: 476
第 9 樓
|
發表於: 星期三 二月 23, 2005 6:50 pm 文章主題: |
|
|
to:syntech兄
基本上每一程序同時只鎖定單一表格;就不發生DeadLock
從邏輯上不得不同意您的說法.
但是實際上, 可不是很好處理, 我們知道表格作批次或多筆異動;
就須先作FiLeLock, 可是難道不作異動之資料表格, 就可不用Lock
了嗎 ?舉個例子:
如果我們依訂單需求(MPS)與BOM作物料需求MRP展開時;異動
的資料可能只是庫存或需求,但是MRP展開的過程中您一定不希望
有人去作訂單(或MPS), 或 BOM 異動, 一次MRP展開發個10幾20分
是平常的事, 這段時間就可能同時將MPS, 與BOM先作FileLock.
或許我們亦可將此種只作依據;不作異動之資料(如BOM, MPS)
先以Cursor方式(專用臨時檔)來取用, 總之避開DeadLock
各人使用技巧不同, 但是一定會使用資源或時間作補償.
或許大家已習慣使用TABLEUPDATE(), 與TABLEREVERT()
資料LOCK時機都交由系統去處理了. |
|
回頂端 |
|
 |
bin1x
註冊時間: 2004-08-27 文章: 462
第 10 樓
|
發表於: 星期三 二月 23, 2005 8:29 pm 文章主題: |
|
|
syntech 寫到: | 感到有點奇怪....
要造成deadlock的話,應該是
互相擁有對方想要的資源的一部分,而且"一定要資源到齊才能運作",所以才會等待對方釋出手中的資源.
個別lock個別所需的table不會造成deadlock,
個別lock A,B,C 三個table,沒有deadlock問題.
而是三個行程各自抓了A,B,C 三個table其中之一,而且這個行程又必須A,B,C 三個table 同時鎖定才能執行.
除非這三個行程能"適時"放開自己的手,讓其他行程有機會同時獲得A,B,C 三個table,
否則將沒有任何一個行程能夠執行.
"有失去,才有獲得",
只是一直嘗試lock,而沒有人放手,還是沒用的.
一般教授"作業系統"的課程都會提到,
如果沒有人願意放手,就由os自己挑選一個"犧牲者",
強迫讓他放手.
這點,在sql server 上也是如此.
其實再windows 操作有時也是會叫出"工作管理員(task manager)"硬生生刪除某個程式,
而讓其他程式能順利執行,
也是相同的道理.
去除掉"一定要資源到齊才能運作"的條件,
例如一次只鎖住一個table執行,
當然就沒有機會造成deadlock. |
認同你說的,且似乎有多人多工之後,才會有所謂死結情況
甚至是java所提的multi-thread
但我在寫應用程式似乎沒有見過,好像有一次巧合類似的情況
事後想起來,那個也是故意製造出的巧合
被整的,如果不是自家人打自家人
那種情況,微乎其微
但能不能修改程式避免,可以啊,怎麼不行呢
但這算不算是在思考系統中,沒有思考到的部份(不夠周延,以致系統有缺點) |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 11 樓
|
發表於: 星期三 二月 23, 2005 10:15 pm 文章主題: |
|
|
知道原理和實作還是有一段差距!
有的時候真是避無可避,
尤其時必須同時異動多個TABLE的時候.
手動鎖定與系統鎖定都一樣,總有那種不能完全避掉的情況.
可是憑我們淺薄的知識及技術又無法作到像OS那麼完整的處理.
只能先設計成客戶強制關掉再重作也不會影響正確性的做法. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|