0

这是我的设置: MySQL 数据库中的表格,包含 30 分钟的时间段(整个小时和半小时) 一个网站,显示一段时间内每个时间段有多少房间可供预订的表格。最低预订时间为一小时,因此每次预订至少保留两个位置,当预订时,它们之前的位置将变得不可用(不能预订房间 30 分钟)

我的问题是这样的:我在 php 脚本中使用 PDO 事务,通过更改它们的状态(两列枚举类型)来为预订预留多个插槽。因此,如果假设两个或多个客户尝试在同一时间段或之前的一个时间段预订房间,如果我使用 SELECT FOR UPDATE 会发生什么?第一个是否继续该过程而其他人被拒绝(通过错误或空集)或其他人是否在第一个完成后等待并在他预订的情况下提交数据库中的更改或在该情况下回滚他改变了主意,然后第二快的客户尝试选择行并更新它们,这取决于第一个客户的操作?

基本上我想知道我是否必须实现某种重试系统。

另外,我很好奇这个临时锁什么时候被移除;仅在事务的情况下提交事务(mysql,自动提交关闭)或影响select语句中的部分/所有行的下一次更新?

4

1 回答 1

-1

基本上,在 PDO 中,事务(以beginTransaction方法开始)只是通过将 autocomit 设置为 false 来“模拟”。因此,即使使用 select to update 并发访问的风险很小,它也存在。

$db->query('START TRANSACTION')然后你可以用 SQL 语句开始你的事务db->query('COMMIT');,当然,在失败的db->query('ROLLBACK'); 情况下,通常,它可以让你避免你的问题。如果你想确定,你可以在交易中使用$db->query('LOCK TABLE ...');

当您使用 Transaction 时,所有内容都会同时发送,这样您的表中就不会出现垃圾。由于每个事务(默认情况下一个查询是一个事务)都是一个接一个地执行,理论上,这可以保护您免受并发访问。但问题是您使用 SELECT 进行更新,我认为当事务不能保护您并且您会默默地删除另一个好的数据时,可能会出现边缘情况。

锁定表对此很有用,因为不允许出现边缘情况。问题是如果你保持锁的时间太长,就会发送错误。

于 2012-11-25T09:53:43.380 回答