php - SQL Codeigniter 事务回滚多路访问回滚

标签 php mysql codeigniter

我有问题。 如果有两个用户当前正在使用由 *代码*提供的事务会发生什么:

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);
}

然后一个用户突然滚动*返回*数据库其他 是否 *批量加载* 他的查询?

最佳答案

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

用于实现可串行化的最流行机制是锁定。这个概念很简单:

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

• 有读锁和写锁

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

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

• 只有当没有其他事务对同一数据项具有冲突锁时,事务才能获得锁。因此,只有当没有事务对x有写锁时,它才能获得对x的读锁。

只有在没有事务对x有读锁和写锁的情况下,它才能获得x的写锁。 尽管锁定的概念很简单,但它对性能和正确性的影响可能很复杂、违反直觉且难以预测。构建健壮的 TP 应用程序需要对锁定有深入的了解。

关于php - SQL Codeigniter 事务回滚多路访问回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21746051/

相关文章:

mysql - 查找包含特定数据的字段名称(mySql)

用于桌面应用程序的 php mysql

php - 使用CodeIgniter框架中的bootstrap notification插入数据后的通知

php - 多语言站点: Cookie or URL Element

php - 从 Zend 表单元素中清除验证错误消息

php - 在什么情况下需要关闭 HTTP 连接?

php - MySQL - 获取星期几

php - 有一种方法可以使用 paypal 进行类似预订的付款吗?

php - 将多个 where 子句与 laravel 查询构建器一起使用

php - CodeIgniter 项目结构