数据库中最大项目数有限的PHP MySQL并发性
我正在使用php和mysql开发一个应用程序,该应用程序限制了事件的绝对最大用户数 在每次启动时,我首先查询数据库,以检查有多少用户已经注册 若仍有剩余位置,则插入新行,若并没有,则将错误返回给用户 防止注册操作被并行请求中断的最佳方法是什么?说:数据库中最大项目数有限的PHP MySQL并发性,php,mysql,concurrency,parallel-processing,Php,Mysql,Concurrency,Parallel Processing,我正在使用php和mysql开发一个应用程序,该应用程序限制了事件的绝对最大用户数 在每次启动时,我首先查询数据库,以检查有多少用户已经注册 若仍有剩余位置,则插入新行,若并没有,则将错误返回给用户 防止注册操作被并行请求中断的最佳方法是什么?说: 用户1查询数据库,还剩下一个位置 用户2跳入,查询,还看到一个地方 用户1注册 用户2注册 因此,我最终会有一个用户超过绝对最大值。我一直在阅读事务和锁,但不确定在这种情况下使用什么 在插入后立即选择并提交之前启动事务是否足够?您想了解事务隔离级
- 用户1查询数据库,还剩下一个位置
- 用户2跳入,查询,还看到一个地方
- 用户1注册
- 用户2注册
在插入后立即选择并提交之前启动事务是否足够?您想了解事务隔离级别: 隔离通常在数据库级别定义为一个属性,该属性定义了一个操作所做的更改对另一个操作可见的方式/时间 有4个隔离级别。它们可能取决于您使用的数据库,但它们可能会: 可序列化 这是最高的隔离级别 对于基于锁的并发控制DBMS实现,可序列化性要求在事务结束时释放读写锁(在选定数据上获取)。当SELECT查询使用ranged WHERE子句时,还必须获取范围锁,特别是为了避免幻象读取现象(见下文) 使用基于非锁的并发控制时,不获取锁;但是,如果系统检测到多个并发事务之间存在写入冲突,则只允许其中一个事务提交。有关此主题的更多详细信息,请参阅快照隔离 可重复读取 在这个隔离级别中,基于锁的并发控制DBMS实现保持读写锁(在选定数据上获取)直到事务结束。但是,范围锁不受管理,因此可能会发生幻象读取 读取已提交的 在这个隔离级别中,基于锁的并发控制DBMS实现将保持写锁(在选定数据上获取)直到事务结束,但一旦执行了SELECT操作,就会释放读锁(因此,在这个隔离级别中可能会发生不可重复的读现象,如下所述)。与上一级别一样,不管理范围锁 简单地说,read committed是一个隔离级别,它保证在读取数据时提交任何读取的数据。它只是限制读者看到任何中间的、未提交的“脏”读。它不承诺如果事务重新发出读取,它将找到相同的数据;数据在读取后可以自由更改 读取未提交的 这是最低的隔离级别。在此级别中,允许脏读,因此一个事务可能会看到其他事务尚未提交的更改 由于每个隔离级别都比下面的隔离级别强,因此没有更高的隔离级别允许较低的隔离级别禁止的操作,因此标准允许DBMS在比请求的隔离级别更高的隔离级别上运行事务(例如,“读取提交”事务实际上可以在“可重复读取”隔离级别上执行) 您希望查看可序列化的。来源:维基百科(请在此处阅读更多信息:)