[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: проблема с транзакциями
Invis1ble
Есть код, суть примерно такая:
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 | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.