1

我们有 2 个脚本/mysql 连接,它们从表中获取行。一旦一个脚本抓取了一些行,另一个脚本就不能访问这些行。

到目前为止,我所得到的似乎可行的是:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
START TRANSACTION

SELECT * FROM table WHERE result='new' FOR UPDATE

// Loop over update
UPDATE table SET result='old' WHERE id=...

COMMIT

据我了解,相同的连接可以读取脏数据,但由于行被锁定,其他连接不应该能够读取。这个对吗?

还有一种更好的方法来保证每行只能在SELECT两个脚本运行的情况下运行一次吗?

编辑:哦......引擎是Innodb

编辑:我也想尽量避免死锁,除非它们真的没有效果,我可以为它们做准备并重新运行查询。

4

1 回答 1

1

SELECT ... FOR UDATE在行上设置排他锁,如果不可能等待锁被释放,SELECT ... FOR UDATE语句的主要目的是防止其他人在您操作它们时读取某些行。

如果我的问题是正确的,那么“脏数据”是指那些锁定的行吗?不明白为什么您称它们为“脏”,因为它们只是被锁定,但实际上在同一事务中您可以读取已锁定的行(显然)。

关于你的第二个问题

还有一种更好的方法来保证在两个脚本都运行的情况下每一行只能选择一次吗?

SELECT ... FOR UDATE保证在每个时刻,某些行只能在一个事务中读取。只要此语句是专门为此目的而设计的,我就没有更好的方法来做到这一点。

于 2012-08-22T06:45:45.633 回答