【问题标题】:how to lock database table in CakePHP如何在 CakePHP 中锁定数据库表
【发布时间】:2015-01-08 02:23:37
【问题描述】:

数据库架构:booking_number(primary,not auto inc), fee (float),...等

“booking_number”将在每次插入时递增。 这不是由数据库本身自动递增的。 “booking_number”必须在代码中增加,并且由于其他原因不能自动完成。

如果我想插入一行,我会读最后一个 “booking_number”,增加它并将新行写回数据库。 同时另一个用户也在插入一行,他读取了 “booking_number”的最后一个条目,与我阅读的相同,因为我没有 还写了新的一行。他还将递增到相同的值,并且 写回来。这将导致冲突。

这样,如果我可以锁定数据库表,其他人就无法读取/写入 直到有人完成对新行的读写。

我可以在 cakephp 中锁定数据库表吗? 我在哪里可以获得参考书或代码??

任何帮助表示赞赏!

【问题讨论】:

  • 您可能不需要为此锁定表。只需按照您的描述运行您的代码。当第二个进程尝试添加具有相同值的新行时,可以捕获重复键错误。当捕获时,重新执行。
  • yap,我也这么认为。可以通过创建view/Errors/pdo_error.ctp来自定义错误信息。并显示消息以重试客户。对吗? @AgRizzo

标签: mysql database cakephp locking


【解决方案1】:

试试这个

$model = $this->loadModel('Info_Table'); 
// if Info_Table model is not available in your controller
$dbo = $model->getDataSource();

$dbo->execute(
        sprintf('LOCK TABLES %s AS %s WRITE;',
            $model->table,
            $model->alias
        )
    );

 // execute query 
$dbo->execute('UNLOCK TABLES');

【讨论】:

  • 如果我的表名是 info_table。我可以这样试试吗?? $dbo = Info_Table ->getDataSource(); $dbo->execute( sprintf('LOCK TABLES %s AS %s WRITE;', $model->Info_Table, $model->info_table ) ); $NewAutoID = Info_Table->find( 'first', array( 'fields' => array('booking_number'), 'order' => array('booking_number'=>'DESC') ) ); $dbo->execute('UNLOCK TABLES'); .......................@u2460470
  • $model 是一个模型对象。型号是什么??
  • 模型名称是 Info_Table。表名是 info_table。
  • fiona,我已将我的代码修改为您的模型对象。
  • 即使我已经锁定了桌子,假设如果两个用户尝试同时预订(完全相同),这意味着他们可以在同一时间锁定桌子。所以可以说这是一个死锁或锁冲突?我该如何防止这种情况?我需要在某个地方设置 lock_time 设置吗?如果我错了,请纠正我。在此先感谢...@u2460470
猜你喜欢
  • 1970-01-01
  • 2012-02-29
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
相关资源
最近更新 更多