function func() {
// START TRANSACTION
try {
insert();
// INSERT INTO `table2` ...
}
catch (Exception $e) {
// ROLLBACK
return false;
}
// COMMIT
return true;
}
function insert() {
// LOCK TABLE `table` WRITE;
// INSERT INTO `table` ...
// UNLOCK TABLES;
}
Проблема в том, что при ошибке во втором инсерте rollback ничего не откатывает, т.к. транзакция была завершена не успев начаться в ф-ции insert() при блокировке таблицы.
Так вот вопрос, можно ли решить эту проблему с неявным коммитом? Потому что insert() - это код подключаемой библиотеки, и править там код нельзя.
Спустя 12 дней, 16 часов, 43 минуты, 30 секунд (30.03.2012 - 12:21) glock18 написал(а):
что с autocommit?
Спустя 12 минут (30.03.2012 - 12:33) Invis1ble написал(а):
glock18
Цитата |
что с autocommit? |
в смысле? в коде нигде значение не устанавливается, следовательно по дефолту...
Вобще, проблему я уже решил отнаследовав класс, в котором идет блокировка и добавив условия в методы блокировки/разблокировки в зависимости от флага, т.е.
protected function lock() {
if ($this->_need_lock)
return parent::lock();
}
Просто интересно, возможно ли решить задачу на уровне СУБД, а не php-кода?
Читал, что вроде в MySQL нет вложенных транзакций...
Спустя 16 минут, 41 секунда (30.03.2012 - 12:50) glock18 написал(а):
Цитата (Invis1ble @ 17.03.2012 - 16:38) |
транзакция была завершена не успев начаться в ф-ции insert() при блокировке таблицы. |
увы, придется найти замену insert(). lock tables с транзакциями две фичи взаимоисключающие, и используемые практически с одними и теми же целями.
я бы, либо патчил insert(), либо написал бы замену с аналогичным входом/выходом, но без локов.
Спустя 41 секунда (30.03.2012 - 12:50) glock18 написал(а):
Цитата (Invis1ble @ 30.03.2012 - 09:33) |
Просто интересно, возможно ли решить задачу на уровне СУБД, а не php-кода? Читал, что вроде в MySQL нет вложенных транзакций... |
вероятнее всего, нет
Спустя 5 минут, 51 секунда (30.03.2012 - 12:56) Invis1ble написал(а):
Ну да, патч - наверное оптимальное решение с точки зрения чистоты кода.
Конечно же моё решение выше временное и написанное на скорую руку, так делать не нужно на самом деле.
Конечно же моё решение выше временное и написанное на скорую руку, так делать не нужно на самом деле.
Спустя 6 минут, 18 секунд (30.03.2012 - 13:03) glock18 написал(а):
Цитата (Invis1ble @ 30.03.2012 - 09:56) |
Конечно же моё решение выше временное и написанное на скорую руку, так делать не нужно на самом деле. |
да нет, вполне себе нормальное решение, на самом деле. за неимением решения на стороне mysql
Спустя 2 минуты, 50 секунд (30.03.2012 - 13:05) Invis1ble написал(а):
а мне не нравится, если чесно
теперь я вынужден делать так:
какбы не особо эстетично... :)
теперь я вынужден делать так:
$model->_need_lock = false;
// insert()
$model->_need_lock = true;
какбы не особо эстетично... :)
_____________
Профессиональная разработка на заказ
Я на GitHub | второй профиль