如何在操作期间锁定表使用php / yii

时间:2014-10-31 09:40:50

标签: php mysql yii

我的表:

CREATE TABLE IF NOT EXISTS `detail_transaction` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `code` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `id_product` int(11) NOT NULL,
  `id_store` int(11) NOT NULL,
  `input_quality` int(11) NOT NULL,
  `output_quality` int(11) NOT NULL,
  `quality_in_store` int(11) NOT NULL,
  PRIMARY KEY (`id`)
)

我遇到的问题如下:

  

我得到记录有max_id,然后在我插入新记录之前,有   插入了另一个进程插入新记录。

我想:我会在“我选择一条记录有max_id”到“我已完成插入新的下一条记录”时锁定表格(不要对该表运行任何任务)。并做这个方法。请帮我!如何通过php代码或Yii执行此操作。

3 个答案:

答案 0 :(得分:2)

您可以使用交易:

$transaction = Yii::app()->db->beginTransaction();
try {
    foreach ($items as $item) {
        $item->attr = value;
        $item->save();
    }
    $transaction->commit();
    // actions to do on success (redirect, alert, etc.)
} catch (Exception $e) {
    $transaction->rollBack();
    // other actions to perform on fail (redirect, alert, etc.)
} 

此源代码来自此帖子:using transaction in a loop in yii

答案 1 :(得分:0)

我不确定你想要实现什么,但我确信如果你只使用交易 - http://www.yiiframework.com/doc-2.0/yii-db-transaction.html它会有效。否则,您始终可以调用LOCK TABLE查询 - http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

$connection = Yii::app()->db;
$lock = $connection-> createCommand('LOCK TABLES `detail_transactions` WRITE');
// do your magic
$unlock = $connection-> createCommand('UNLOCK TABLES');

答案 2 :(得分:0)

在Yii2中,你可以像这样锁定/解锁一个表

$db = Yii::$app->getDb();
$db ->createCommand('LOCK TABLES `YOUR_TABLE` WRITE')->execute();
// access YOUR_TABLE here 
// something like YOUR_TABLE_MODEL::find()->where(["something" => "blah"])->one()
$db ->createCommand('UNLOCK TABLES')->execute();