我正在使用MySQL 5.0
我的应用程序由多个用户使用。所有数据都提供一个共享表products
(用于更新),我不想丢失任何用户更新,我无法锁定整个表bcz它减慢了我的应用程序。同样的原因,我无法申请锁定我的程序。
现在我想使用:
SELECT * FROM products limit 1;
...以便其他数据库连接在更新完成之前无法读取此行。
我试过了:
query = "select min(nextag_product_id) from products where is_bottomline = 0 and timestamp <= date_sub(now(), interval 30 minute) for update"
...但是这无法锁定其他连接以读取此行。同时,相同的产品会在多个用户上打开。
对于MySql已知的SELECT FOR UPDATE,这是正确的提示吗?
答案 0 :(得分:1)
您可以使用将设置排他锁的提示with(xlock)
来锁定行。在这种情况下,在第一个事务提交或回滚之前,其他事务甚至无法读取锁定的数据。
如果您希望其他交易能够读取第一笔交易未选择的数据,您需要在两笔交易中使用Index Seek
来读取数据。
假设我们必须进行交易:
/* 1st transaction */
SELECT *
FROM tbl with(xlock)
WHERE field1=1
/* 2nd concurrent transaction */
SELECT *
FROM tbl with(xlock)
WHERE field1=2
/* 3d concurrent transaction */
SELECT *
FROM tbl
WHERE field1=1
如果您没有1field11的索引,那么第二次交易就必须等待第一笔交易的完成
但是如果在field1
上创建索引,则第二个事务将并行执行,而3d事务仍将等待第一个事务的结束。
CREATE INDEX IX_tbl_field1 ON tbl