2014-10-31 1 views
0

Мой стол:Как заблокировать таблицу во время использования операции PHP/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.

ответ

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

+0

Как установить изоляциюLevel для транзакции –

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'); 
+0

Какая разница между использованием «Lock Table» и «Transaction»? –

+0

Сделка делает набор запросов атомарным. Подробнее здесь http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-transactions.html – motanelu

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(); 
+0

Добавить описание – Billa

Смежные вопросы