数据库

时间:2016-04-29 17:02:16

标签: php mysql concurrency parallel-processing

我正在开发一个应用程序,它使用php和mysql限制事件的最大用户数量。

每次唱歌时,我首先查询数据库,检查已签名的用户数量。

如果还有剩下的地方,则会插入新行,如果不存在,则会向用户返回错误。

防止注册操作被并行请求中断的最佳方法是什么?说:

  • 用户1查询数据库,还有一个地方
  • 用户2跳入,查询,还看到一个地方
  • 用户1注册
  • 用户2注册

所以我最终会得到一个超过绝对最大值的用户。我一直在阅读交易和锁定,但我不确定在这种情况下应该使用什么。

在插入后立即选择并提交之前启动事务是否足够?

1 个答案:

答案 0 :(得分:0)

您想要查看事务隔离级别:

  

隔离通常在数据库级别定义为一个属性,用于定义一个操作所做的更改如何/何时对其他操作可见。

有4个隔离级别。它们可能依赖于您正在使用的数据库,但它们很可能是这些:

<强>序列化

这是最高的隔离级别。

使用基于锁的并发控制DBMS实现,可序列化需要在事务结束时释放读取和写入锁(在选定数据上获取)。当SELECT查询使用ranged WHERE子句时,也必须获取范围锁,尤其是为了避免幻像读取现象(见下文)。

使用基于非锁定的并发控制时,不会获取锁定;但是,如果系统检测到多个并发事务之间的写冲突,则只允许其中一个事务提交。有关此主题的更多详细信息,请参阅快照隔离。

可重复读取

在此隔离级别中,基于锁的并发控制DBMS实现会保留读取和写入锁定(在选定数据上获取),直到事务结束。但是,不管理范围锁定,因此可能会发生幻像读取。

读取已提交

在此隔离级别中,基于锁的并发控制DBMS实现保持写锁(在所选数据上获取)直到事务结束,但是一旦执行SELECT操作就会释放读锁(所以非如下所述,在这种隔离级别中可能发生可重复读取现象。与上一级别一样,不管理范围锁定。

简单来说,read committed是一个隔离级别,可以保证读取时提交任何数据。它只是限制读者看到任何中间的,未提交的,“脏”的读。它没有任何承诺,如果事务重新发出读取,它将找到相同的数据;数据在读取后可以自由更改。

读取未提交

这是最低的隔离级别。在此级别中,允许脏读,因此一个事务可能会看到其他事务所做的尚未提交的更改。

由于每个隔离级别都比下面的隔离级别更强,因为没有更高的隔离级别允许更低级别的操作禁止,标准允许DBMS以比请求更强的隔离级别运行事务(例如,“读取已提交的“事务实际上可以在”可重复读“隔离级别执行。

您想要了解Serializable。资料来源:维基百科(在此处阅读更多内容:https://en.wikipedia.org/wiki/Isolation_(database_systems))。