Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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_Concurrency_Parallel Processing - Fatal编程技术网

数据库中最大项目数有限的PHP MySQL并发性

数据库中最大项目数有限的PHP MySQL并发性,php,mysql,concurrency,parallel-processing,Php,Mysql,Concurrency,Parallel Processing,我正在使用php和mysql开发一个应用程序,该应用程序限制了事件的绝对最大用户数 在每次启动时,我首先查询数据库,以检查有多少用户已经注册 若仍有剩余位置,则插入新行,若并没有,则将错误返回给用户 防止注册操作被并行请求中断的最佳方法是什么?说: 用户1查询数据库,还剩下一个位置 用户2跳入,查询,还看到一个地方 用户1注册 用户2注册 因此,我最终会有一个用户超过绝对最大值。我一直在阅读事务和锁,但不确定在这种情况下使用什么 在插入后立即选择并提交之前启动事务是否足够?您想了解事务隔离级

我正在使用php和mysql开发一个应用程序,该应用程序限制了事件的绝对最大用户数

在每次启动时,我首先查询数据库,以检查有多少用户已经注册

若仍有剩余位置,则插入新行,若并没有,则将错误返回给用户

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

  • 用户1查询数据库,还剩下一个位置
  • 用户2跳入,查询,还看到一个地方
  • 用户1注册
  • 用户2注册
因此,我最终会有一个用户超过绝对最大值。我一直在阅读事务和锁,但不确定在这种情况下使用什么


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

您想了解事务隔离级别:

隔离通常在数据库级别定义为一个属性,该属性定义了一个操作所做的更改对另一个操作可见的方式/时间

有4个隔离级别。它们可能取决于您使用的数据库,但它们可能会:

可序列化

这是最高的隔离级别

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

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

可重复读取

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

读取已提交的

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

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

读取未提交的

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

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

您希望查看可序列化的。来源:维基百科(请在此处阅读更多信息:)