php - 不同的请求生成相同的序列号

标签 php mysql cakephp

我在表中插入一个序列号,该序列号总是加一,但是当多个请求同时到来时,它会为不同的请求插入相同的序列号。我正在使用 mysql 数据库。

我知道我在代码中过早获取最大序列号,如果请求同时到达,那么它将为两者获取相同的序列号。完成所有工作后更新序列号是个好主意吗?如果为新请求插入一条记录并更新前一个请求的序列号是同时发生的该怎么办?

public function add(){
    $session          = $this->request->session();

    $company_id       = $session->read('Admin.company_id');
    $emp_id           = $session->read('Admin.emp_id');
    $user_email_id           = $session->read('Admin.email_id');
    $employee_name           = $session->read('Admin.employee_name');

    $conn = ConnectionManager::get('default');

    if ($this->request->is('post')) {

        try{

                $conn->begin();   
                $department = $this->request->data['department'];
                $data = $this->request->data;

                if(!array_key_exists('is_requisition_for_contractor', $data)){
                    $is_requisition_for_contractor = 0;
                } else {
                    $is_requisition_for_contractor = $data['is_requisition_for_contractor'];
                }

                if(!array_key_exists('is_requisition_for_employee', $data)){
                    $is_requisition_for_employee = 0;
                } else {
                    $is_requisition_for_employee = $data['is_requisition_for_employee'];
                }

                if(!array_key_exists('is_boulder_requisition', $data)){

                    $is_requisition_for_boulder = 0;
                } else {
                    if($data['is_boulder_requisition'] == ''){
                        $is_requisition_for_boulder = 0;
                    } else {
                        $is_requisition_for_boulder = $data['is_boulder_requisition'];
                    }
                }
                $is_requisition_for_plant = 0;
                if(!array_key_exists('is_plant_requisition', $data)){

                    $is_requisition_for_plant = 0;
                } else {
                    if($data['is_plant_requisition'] == ''){
                        $is_requisition_for_plant = 0;
                    } else {
                        $is_requisition_for_plant = $data['is_plant_requisition'];
                    }
                }

                if(array_key_exists("files",$this->request->data)) {
                    $files      = $this->request->data['files'];

                    if (count($files)) {
                        $files_uploading_response = $this->uploadMultipleFiles($files, 'files/requisitions/');
                    }
                }
                $last_material_insert_id = '';
                if($this->request->data('material_id')[0] == ''){
                    if($this->request->data('department') == 1){
                        $type = 1;
                    } elseif($this->request->data('department') == 3){
                        $type = 3;
                    } elseif($this->request->data('department') == 2){
                        $type = 2;
                    }
                    if($this->request->data('department') == 1 || $this->request->data('department') == 3){
                        $conn->execute("INSERT INTO material (material_name, material_type_id, company_id, status, is_approved_by_admin) VALUES (?,?,?,?,?)",[$this->request->data('material_name'), $type, $company_id, 1,0]);
                        $last_material_insert_id = $conn->execute("SELECT LAST_INSERT_ID() AS last_id")->fetchAll('assoc');
                    } elseif($this->request->data('department') == 2) {

                        //todo for unapproved material
                        $conn->execute("INSERT INTO material (part_no, material_type_id, company_id, status, is_approved_by_admin,unique_category_id) VALUES (?,?,?,?,?,?)",[$this->request->data('part_no')[0], $type, $company_id, 1,0,$this->request->data('unique_category_id')[0]]);
                        $last_material_insert_id = $conn->execute("SELECT LAST_INSERT_ID() AS last_id")->fetchAll('assoc');
                    }

                }
                // here i am fatching max serial number from table
                $requistion_number          = $conn->execute("SELECT IF(MAX(requisition_no) IS NULL, 0,MAX(requisition_no))  AS requisition_no FROM requisition WHERE site_id = ?",[$this->request->data('site_id')])->fetchAll('assoc');
                $Requisition                = TableRegistry::get('requisition');
                $requisition                = $Requisition->newEntity();
                $requisition->registered_on = $this->request->data['date'];
                $requisition->department_id = $this->request->data('department');
                $requisition->site_id = $this->request->data('site_id');
                $requisition->issues_to_id = $this->request->data['prepared_by_id'];
                $requisition->prepared_by_id = $this->request->data['prepared_by_id'];
                $requisition->approved_by_id = $this->request->data['hod_id'];
                $requisition->hod_id         = $this->request->data['hod_id'];
                $requisition->is_diesel_requisition_for_employee = $is_requisition_for_employee;
                $requisition->is_diesel_requisition_for_contractor = $is_requisition_for_contractor;
                $requisition->is_requisition_for_boulder         = $is_requisition_for_boulder;
                $requisition->is_requisition_for_plant = $is_requisition_for_plant;
                if(array_key_exists('for_tanker_stock', $this->request->data))    {
                    $requisition->for_tanker_stock         = 1;
                }
                if($last_material_insert_id != ''){
                    $requisition->is_material_approved_by_admin = 0;
                }
                $requisition->status         = 1;
                $site_id                     = $this->request->data['site_id'];
                $requisition->requisition_no = $requistion_number[0]['requisition_no'] + 1;
                $requistionnumber = $requistion_number[0]['requisition_no'] + 1;


                $saveRequsition = $Requisition->save($requisition);
                $conn->commit();
}

我期望每个请求输出不同的序列号。任何优化方法都可以做到这一点。提前致谢。

最佳答案

好的,同样的策略怎么样,在插入行后设置 $requisition_number (请参阅我的其他答案),但使用与确定新行相同的方法的单个查询申请编号:

$conn->execute("UPDATE requisition 
                SET requisition_no = (SELECT IF(MAX(requisition_no) IS NULL, 0,MAX(requisition_no)) AS requisition_no FROM requisition WHERE site_id = ?) + 1",
               [$this->request->data('site_id')]);

这里的想法是单个查询将在一个步骤中执行,而不会受到另一个类似查询的干扰。

关于php - 不同的请求生成相同的序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57025456/

相关文章:

jquery - CakePHP:计算整个表的总计

php - 如何通过单击单选按钮更改值

php - 简化复杂的count SQL语句

php - 如果表中存在值则循环查询直到不存在

sql-server - Linux 上的 Cakephp2 不能与 Sql Server (mssql) 一起使用

PHP 通过许多调整将 JSON/CSV 匹配到 SQL 数据库 (cakePHP)

php - 基于输入的正则表达式创建

php - Mysql拆分字符串并只得到整数值

sql - 使用目标为列的 MySQL 的 "IN"函数?

php - laravel 无法将相同的值组合在一起