2016-04-29 36 views
2

我正在研究一个应用程序,该应用程序使用php和mysql来限制事件发生的绝对最大数量。PHP MySQL数据库中的最大限制项的并发性

在每次唱歌时,我首先查询数据库,以检查有多少用户已经签名。

如果还有剩下的地方,则插入新行,如果不是,则返回给用户错误。

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

  • 用户1个查询数据库中,有左
  • 用户2跳跃,查询一个地方,也看到了一个地方留下
  • 用户1点报
  • 用户2点报

所以我最终会得到一个用户超过绝对最大值。我一直在阅读事务和锁,但不知道在这种情况下使用什么。

在插入之后选择并提交权限之前启动事务就足够了吗?

回答

0

你想看看事务隔离级别:

隔离是在数据库级别通常被定义为定义如何/当由一个操作所做的更改成为对其他可见的属性。

有4个隔离级别。他们可能取决于你所使用的数据库上,但他们很可能这些:

序列化

这是最高的隔离级别。

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

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

重复读取

在该隔离电平,基于锁的并发控制DBMS实施不断读锁和写锁(在选定数据中获取),直到该事务的结束。但是,范围锁不受管理,因此可能发生幻像读取。

读取已提交

在这种隔​​离级别,一个基于锁的并发控制的DBMS实现保持写锁(在所选数据收购),直到交易结束,但读锁被很快释放的执行SELECT操作(因此,在此隔离级别中会发生不可重复读取现象,如下所述)。与前一级一样,范围锁不受管理。

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

读未提交

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

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

你想看看Serializable。来源:维基百科(在这里阅读更多:https://en.wikipedia.org/wiki/Isolation_(database_systems))。