Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL锁定问题_Php_Mysql_Locking - Fatal编程技术网

Php MySQL锁定问题

Php MySQL锁定问题,php,mysql,locking,Php,Mysql,Locking,我有一个类似于在线聊天客户端的东西。当一个用户发送消息时,它将以id=currentID+1存储在MySQL数据库表中。我有另一个客户端长时间轮询并等待消息“id=currentID+1” 在此交换之后,该行将不再使用 这个箱子需要锁吗?我担心的是,在编写PHP端完成创建行之前,读取PHP端将能够看到该行并读取其值。MySQL在完成读取之前不会使该行可用(对于MyISAM,它会自动获取一个表锁,对于INNODB,它会自动获取一个行锁。因此,不,只要您只插入行(而不是稍后对其调用更新等),就应该可

我有一个类似于在线聊天客户端的东西。当一个用户发送消息时,它将以
id=currentID+1
存储在MySQL数据库表中。我有另一个客户端长时间轮询并等待消息“id=currentID+1”

在此交换之后,该行将不再使用


这个箱子需要锁吗?我担心的是,在编写PHP端完成创建行之前,读取PHP端将能够看到该行并读取其值。

MySQL在完成读取之前不会使该行可用(对于MyISAM,它会自动获取一个表锁,对于INNODB,它会自动获取一个行锁。因此,不,只要您只插入行(而不是稍后对其调用更新等),就应该可以了)。

MySQL在完成读取之前不会使行可用(对于MyISAM,它会自动获取一个表锁,对于INNODB,它会自动获取一个行锁。因此,不,只要您只插入行(而不是稍后对其调用更新等),就可以了)。

MySQL中的写入是原子的。其他查询无法“查看”假设您使用一个
INSERT
语句来执行此操作,则在完全写入该行之前,该行将被删除。

在MySQL中的写入是原子的。其他查询无法“查看”假设您使用一条
INSERT
语句来执行此操作,则新行将一直保留到完全写入为止。

新行仅在插入后由select查询查看

插入是原子的

是的,myisam采用表级锁定,而innodb采用行级锁定


事务中的一组语句被视为atmoic,在事务提交之前,任何读取都看不到效果,您可以执行
select shared
以查看未提交的数据。

插入新行后,select查询才会看到新行

插入是原子的

是的,myisam采用表级锁定,而innodb采用行级锁定


事务中的一组语句被视为atmoic,在事务提交之前,任何读取都看不到效果,你可以执行
选择shared
来查看未提交的数据。

你的意思是MySQL中的插入是原子的,对吗?如果写入是原子的,我认为我们不需要锁。@teehoo:不,我的意思是写入。锁用于en您希望以原子方式执行多次写入。例如,从一个帐户扣除余额并将其放入另一个帐户需要在一个事务中完成。但是,如果您执行单个insert或update语句,则在完成之前,没有人可以看到它(也就是说,如果你更新了5列,他们在只有3列更新的状态下不会看到)。你是说MySQL中的插入是原子的,对吗?如果写入是原子的,我认为我们不需要锁。@teehoo:不,我是说写入。当你想原子地进行多次写入时,会使用锁。例如,从一个帐户扣除余额并将其放入另一个帐户需要在一个事务中完成。但是如果你只执行一次插入或更新,则需要使用锁语句,在它完成之前,没有人可以看到它(即,如果您更新5列,他们在只有3列更新的状态下不会看到它)。所以让我直说吧。插入操作总是隐式锁定表(ISAM)或行(innoDB)?正确。InnoDB可能会稍微复杂一些,因为您可以拥有一个事务,在发出commit命令之前它会被锁定。但是对于一般用途(在InnoDB中不启动事务),这是正确的…所以让我澄清一下。insert操作始终隐式锁定表(ISAM)或行(InnoDB)?正确。InnoDB可能会稍微复杂一点,因为在发出commit命令之前,您可以在事务中锁定它。但对于一般用途(在InnoDB中不启动事务),这是正确的。。。