SQL Codeigniter事务回滚多次访问回滚

时间:2014-02-13 05:33:45

标签: php mysql codeigniter

我有疑问。会发生什么 IF 目前有两个用户正在使用 * 代码提供的交易 *:< / p>

function upload_csv($filename,$type){
            $source = fopen(base_url().'uploads/'.$filename, 'r') or die("Problem open file");
             $data = fgetcsv($source,","); //1st Line /*DESCRIPTION PART*/
             $data = fgetcsv($source,","); //2nd Line /*DATA START*/
             $this->db->trans_begin();
             $loopflag = true;
             switch($type){     
                case 'receivable':
                                do{
                                    if($data[0]!=""){
                                        $loopflag = $this->csv_parser_receivable($data);
                                    }
                                    if($loopflag==false){break;}
                                }while($data = fgetcsv($source,1000,",")); 
                                break;
                case 'supplier':
                                do{
                                    if($data[0]!=""){
                                        $loopflag = $this->csv_parser_supplier($data);
                                    }
                                    if($loopflag==false){break;}
                                }while($data = fgetcsv($source,1000,",")); 
                                break;


                            }

        if (($this->db->trans_status() === FALSE)||($loopflag==false))
        {
            $this->chromephp->log('CANCELLED');
            // $this->chromephp->log("FAIL!! ROLLING BACK TO THE DEEP!");
            $this->db->trans_rollback();
        }
        else
        {
            $this->chromephp->log("FINISHED");
            // $this->chromephp->log("SUCCESS! COMMITTING....");
            $this->db->trans_commit();

            $this->consolidate_add($filename,$type);
        }
        $this->db->trans_end();

             fclose($source);
}

然后一个用户突然滚动 * 返回 *数据库,而 其他 strong> 仍然 * 批量加载 *他的查询?

1 个答案:

答案 0 :(得分:1)

交易的一个重要特性是它们是孤立的。从技术上讲,这意味着事务的执行与在空中运行事务具有相同的效果,一个接一个地按顺序执行,在执行任何两个事务时没有重叠。此类执行称为 serializable ,这意味着“与串行执行具有相同的效果。”

用于获得可串行化的最常用机制是 locking 。这个概念很简单:

• 每个事务都保留对其使用的数据的访问权限。预订称为a 锁

• 有读锁和写锁

• 在读取数据之前,事务设置读锁定。在写入数据之前,它会设置写锁定。

• 读锁与写锁冲突,写锁与写锁冲突。

• 仅当没有其他事务在同一数据项上存在冲突锁定时,事务才能获取锁定。因此,只有当没有事务在x上有写锁定时,它才能在x上获得读锁定。

只有当没有事务在x上有读锁或写锁时,它才能在x上获得写锁。 虽然锁定的概念很简单,但它对性能和正确性的影响可能很复杂,反直觉,难以预测。构建强大的TP应用程序需要对锁定有充分的了解。