作者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