2010-05-21 59 views
1

我有类似于网上聊天客户端的东西。当一个用户发送一条消息时,它将被存储在一个带有id=currentID+1的MySQL数据库表中。我有另一个客户端长时间轮询并等待消息'id = currentID + 1'。MySQL的锁定问题

在此交换之后,该行永远不会再使用。

我需要在这种情况下,锁?我担心的是阅读PHP端能够在写入PHP端完成创建行之前看到该行并读取其值。

回答

1

在读取完成之前,MySQL不会使该行可用(在MyISAM的情况下,它会自动获取表锁,或者在INNODB的情况下会自动获取行锁)因此,只要您“再只插入行(而不是稍后再打上更新等)...

+0

所以让我弄清楚这一点。插入操作总是隐式锁定表(ISAM)或行(innoDB)? – 2010-05-21 17:56:28

+0

正确。 InnoDB可能会更复杂一点,因为您可以在发出commit命令之前拥有一个锁定事务。但是对于一般使用(不启动InnoDB的交易),这是正确的...... – ircmaxell 2010-05-21 18:20:59

0

在MySQL中写是原子,其他查询无法‘看到’行,直到它完全写的,假设你使用单INSERT语句来做到这一点。

+0

你的意思是在MySQL刀片是原子吗?如果写入是原子的,我不认为我们需要锁。 – 2010-05-21 17:55:21

+0

@teehoo:不,我的意思是写道。当你想以原子方式执行多个*写操作时会使用锁。例如,从一个账户中扣除余额并将其存入另一个账户需要在交易中完成。但是,如果你做一个单一的插入或更新语句,没有人能看到它,直到它完成(即,如果你更新5列,他们将不会看到它在只有3更新的状态)。 – ryeguy 2010-05-21 22:10:14

0

新行只会通过选择查询后其插入。

可见插入是原子的

并且是myisam提供表级锁定,而innodb提供行级锁定。

和一组事务中的语句被认为是atmoic,任何读取都不会看到效果,直到事务提交,您可以执行select shared来查看未提交的数据。