如何使用SELECT FOR UPDATE

时间:2014-07-10 05:14:06

标签: mysql sql

我正在使用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,这是正确的提示吗?

1 个答案:

答案 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