【问题标题】:Can Codeigniter Transaction Start When Another Transaction Running on The Same Table?当另一个事务在同一个表上运行时,Codeigniter 事务可以启动吗?
【发布时间】:2017-11-14 06:22:40
【问题描述】:

我有一个名为 demo_model 的模型,其中包含如下方法:

class Hell_model extends CI_Model {
   function insert_demon_to_hell()
   {
       $this->db->trans_start();
       //insert to helldb for example
       //update to helldb for example
       $this->db->trans_complete();
   }
}

我有一个名为 demo_controller 的控制器,就像这样

//REST CONTROLLER INCLUDED HERE

class Demon_controller extends REST_CONTROLLER {
    function contruct() {
        //LOAD HELL MODEL HERE
    }

    function demon () {
       $demon_id = $this->get('demon_id');
       $this->hell_model->insert_demon_to_hell($demon_id);
    }
}

当有人遇到恶魔时,此 API 将调用。问题是当两个或更多人同时遇到恶魔(调用函数)时,即使我已经在模型函数中使用了事务,查询仍然会在同一张表上运行吗?

【问题讨论】:

  • 如果您有任何不明确之处,请在下方发表评论。
  • 事务不控制并发性,它们只是确保所有修改都完成或不做任何修改。它是控制并发的锁定机制。
  • 你有控制并发的解决方案吗?
  • 正如我所写:锁。
  • 抱歉我的描述不好。因为我不知道该怎么说。

标签: php mysql codeigniter transactions


【解决方案1】:

事务不控制并发性,它们只是确保所有修改都完成或不做任何修改。控制并发的是locking mechanism

因此,理论上同时运行的事务数量是无限的。但是,他们可以做什么以及什么时候可以做受到事务中语句隐式或显式设置的锁的限制。

还有一件更重要的事情:db->trans_start() 启动 数据库 事务,而不是 CI 事务。这意味着事务仅适用于在 db 级别完成的更改,而不适用于在 CI 级别完成的更改。例如。如果您对未保存在数据库中的 CI 对象的属性进行更改,则回滚不会影响该属性的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多