用户提交表单时生成LP前缀自增refno编号的实现方案问询
你要的逻辑可以直接在insert_listing方法里实现,同时通过数据库事务保证原子性,避免并发提交出现编号重复的问题,具体修改如下:
修改模型类insert_listing方法
function insert_listing($maindata){ // 开启事务,保证查询+插入的原子性,避免并发重复 $this->db->trans_start(); // 查询最新的最大refno,加行锁避免并发查询拿到相同值 $this->db->select('refno'); $this->db->from('crm_listings'); $this->db->order_by('refno', 'DESC'); $this->db->limit(1); $this->db->lock_for_update(); // 加写锁,其他事务要等当前事务提交才能查询 $query = $this->db->get(); $new_num = 1; if($query->num_rows() > 0){ $last_ref = $query->row()->refno; // 去掉LP前缀转成数字 $last_num = intval(str_replace("LP", "", $last_ref)); $new_num = $last_num + 1; } // 生成新的refno,补5位前导零 $new_refno = 'LP' . str_pad($new_num, 5, '0', STR_PAD_LEFT); // 把refno加到插入数据数组 $maindata['refno'] = $new_refno; // 执行插入 $this->db->insert("crm_listings",$maindata); $prime = $this->db->insert_id(); // 提交事务 $this->db->trans_complete(); if ($this->db->trans_status() === FALSE) { return false; } return $prime; }
补充说明
- 上述代码适配CodeIgniter 3及以上版本,用事务+行锁的组合,确保两个用户同时提交时,后到的请求会等前一个请求的事务提交完成后再查询最大refno,不会拿到相同数值生成重复编号。
- 建议额外给数据库的
refno字段加上唯一索引,作为兜底避免极端情况出现重复编号。 - 控制器代码不需要做任何修改,所有生成逻辑都收敛在模型插入方法内,符合你仅在提交时生成编号的需求。
内容的提问来源于stack exchange,提问作者H2O
相关产品推荐
相关产品推荐

