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

在PHP/MySQL中手动递增计数器的最佳方法是什么?

在PHP/MySQL中手动递增计数器的最佳方法是什么?,php,mysql,Php,Mysql,我需要在我的一个项目中使用batchId,一行或多行可以有一个batchId。因此,当我要从单个用户插入一组1000行时,我将为这1000行提供一个batchId。此batchId是下一个自动增量batchId 目前,我维护一个单独的数据库表,用于唯一的_id,并将最后一个batchId存储在那里。 每当我需要在表中插入一批行时,我都会将unique_ids表中的batchId更新1,并将其用于批插入 update unique_ids set nextId = nextId + 1 where

我需要在我的一个项目中使用batchId,一行或多行可以有一个batchId。因此,当我要从单个用户插入一组1000行时,我将为这1000行提供一个batchId。此batchId是下一个自动增量batchId

目前,我维护一个单独的数据库表,用于唯一的_id,并将最后一个batchId存储在那里。 每当我需要在表中插入一批行时,我都会将unique_ids表中的batchId更新1,并将其用于批插入

update unique_ids set nextId = nextId + 1 where `key` = 'batchId';

select nextId from unique_ids where `key` = 'batchId';
我调用了一个函数,该函数触发上述两个查询,并返回批处理的nextId(batchId)

这是我的PHP类和函数调用。我使用的是ADODB,您可以忽略与ADODB相关的代码

        class UniqueId
        {
                static public $db;

                public function __construct()
                {

                }

                static public function getNextId()
                {
                        self::$db = getDBInstance();        
                        $updUniqueIds = "Update unique_ids set nextId = nextId + 1 where `key` = 'batchId'";
                        self::$db->EXECUTE($updUniqueIds);

                        $selUniqueId = "Select nextId from unique_ids where `key` = 'batchId'";
                        $resUniqueId = self::$db->EXECUTE($selUniqueId);

                        return $resUniqueId->fields['nextId'];
                }
        }
现在,每当我需要下一个batchId时,我只需调用下面的代码行

`$batchId = UniqueId::getNextId();`
但真正的问题是,当一秒钟内同时有数百个请求时,它会给两个不同的批提供相同的batchId。这对我来说是一个严重的问题。我需要解决这个问题


请建议我该怎么办?我可以只限制该类的一个实例,这样就不会有同时的请求一次调用该函数,也不会给两个不同的批提供一个batchId。

了解一下原子操作或事务。它将锁定数据库,并且在任何给定实例上只允许一次写查询

这可能会影响您的性能,因为现在其他用户必须等待解锁的数据库

我不知道ADODB提供了什么样的支持

基本概念是:

Acquire Lock
Read from DB
Write to DB with new ID
Release Lock
如果已获取锁,脚本将被阻止(忙等待),直到再次释放。但这样可以保证不会发生数据危险。

开始传输 更新 挑选 承诺

这样,更新锁可以防止两个并发运行提取相同的值


如果选择第一个,共享锁将不会隔离这两个

此锁将使数据库锁定还是表锁定?如果它正在锁定数据库,我将无法使用它。