作者elefant ()
看板Database
標題[求救] 一個典型的Transaction問題
時間Sun Jun 7 10:42:35 2009
我的需求是這樣的
有個table A 初始狀態是指有一筆為0的資料
之後會有多台電腦同時存取此table A
每次先
(1) query最後一筆資料得到一數 X
(2) Y = X+1
(3) 新增 Y 至 table A
所以這table就會慢慢變大
而且資料是 '2', '3', '4', '5', '6', .... 一直新增至此table。
要實作此一功能
直覺想到的就是將(1)(2)(3)包在一transaction裡面:
Begin Transaction
(1)
(2)
(3)
Commit Transaction
但根據我實際操作的結果
如果schedule如下
假設原先最後一筆資料是 X = 10
T1 T2
------------------------------------------
BEGIN
------------------------------------------
(1) Read X = 10
------------------------------------------
BEGIN
------------------------------------------
(1) Read X = 10
------------------------------------------
(2) Y = X+1 = 11
------------------------------------------
(2) Y = X+1 = 11
------------------------------------------
(3) insert Y = 11
------------------------------------------
COMMIT
------------------------------------------
(3) insert Y = 11
------------------------------------------
COMMIT
------------------------------------------
對於T2的commit, 本來以為會fail, 但竟然沒有!
不知道原因是甚麼?
是transaction本來就沒有預防這種RW conflict嗎?
還是需要做一些isolation level 的設定?
另外我想到的方法是用 TABLOCKX
但是不是access沒有啊? 因為我用 SELECT * from TableName with (TABLOCKX)
出現以下的訊息: "在 WITH OWNERACCESS OPTION 宣告中語法錯誤。"
不知道是甚麼原因呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.12.50
1F:推 Adonisy:which DB system 06/07 11:01
2F:→ elefant:目前用的是MS Access 06/07 13:41
3F:→ sryang:設定primary key吧 08/03 00:13