我的需求是這樣的
有個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
推
06/07 11:01, , 1F
06/07 11:01, 1F
→
06/07 13:41, , 2F
06/07 13:41, 2F
→
08/03 00:13, , 3F
08/03 00:13, 3F