如何在CakePHP中锁定数据库表

3

数据库模式:booking_number(主键,非自动增量),费用(浮点数)......等等

"booking_number" 在每次插入时都要递增。这不是由数据库自身自动递增的。 "booking_number" 必须在代码中递增,不能出于其他原因自动完成。

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

因此,如果我可以锁定数据库表,直到有人完成读取和写入新行之前,其他人就无法读取/写入该表。

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

任何帮助都将不胜感激!


您可能不需要为此锁定表。只需按照您描述的方式运行代码即可。当第二个进程尝试使用相同的值添加新行时,可以捕获到重复键错误。一旦被捕获,就重新执行。 - AgRizzo
是的,我也这么想。可以通过创建view/Errors/pdo_error.ctp来自定义错误消息,并向客户显示重试消息。对吧?@AgRizzo - fiona
1个回答

0

试试这个

$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'); - fiona
$model是一个模型对象。这个模型的名称是什么? - Supravat Mondal
模型名称为Info_Table。表名为info_table。 - fiona
Fiona,我已经按照你的模型对象修改了我的代码。 - Supravat Mondal
即使我已经锁定了表格, 假设两个用户同时尝试预订(完全相同), 这意味着他们可以在同一时间锁定表格。 那么可以说这是死锁或锁冲突吗?? 我该如何防止这种情况?? 我需要在某个地方设置lock_time设置吗?? 如果我错了,请纠正我。提前致谢... @u2460470 - fiona

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接