[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проверка на поддержку транзакций.
Страницы: 1, 2
twin
Нарвался на задачу. Мне нужно проверить, поддерживается ли транзакция текущим движком.

PDO бросает эксепшен только если транзакция не поддерживается драйвером. А вот такая шняга пролазит на ура :) Если таблица MyISAM :

$pdo->startTransaction();

$dbh->exec("DROP TABLE `table`");

$pdo->rollback();


Как сие предотвратить? Вернее мне не предотвратить надо, а предупредить, что транзакция текущим движком не поддерживается.

Можно было бы (ресурс тут не важен) сделаь проверку. К примеру запрос
SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES
WHERE
TABLE_NAME = 'table'
покажет то что надо - текущий тип. Но для этого нужно знать имя таблицы. А его нет, есть только текст запроса. Парсить его из запроса не вариант. Там могут и join быть, и union, и бог весть что.

Мож есть мысли у кого, пока я голову грею? :)

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Arh
twin
Цитата
Но для этого нужно знать имя таблицы.

А если взять список всех таблиц и для всех проверить и закешировать результат, а потом предупреждать?

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Invis1ble
Цитата (twin @ 18.03.2017 - 10:06)
Но для этого нужно знать имя таблицы. А его нет, есть только текст запроса. Парсить его из запроса не вариант. Там могут и join быть и union и бог весть что.
S.Chushkin
Что есть "текущий движок"?

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
AllesKlar
Цитата (S.Chushkin @ 18.03.2017 - 12:17)
Что есть "текущий движок"?

Свернутый текст
user posted image


_____________
[продано копирайтерам]
twin
Цитата (Arh @ 18.03.2017 - 06:24)
А если взять список всех таблиц и для всех проверить и закешировать результат, а потом предупреждать?
Мне не надо для всех. Мне надо для тех, что в текущем запросе.
Цитата (Invis1ble @ 18.03.2017 - 09:57)
А вот был бы квери билдер...
Не поверишь, но именно его я и делаю biggrin.gif Решил немного поковырять свой фреймворк. А так я даже и представить не могу, для чего еще нужна была бы такая надобность. Да и с билдером тоже бяда. Я сейчас изучил этот предмет изнутри во всех тонкостях и понял совершеннейшую глупость этой затеи. Когда закончу, поделюсь мыслями, их есть у меня. smile.gif
Цитата (S.Chushkin @ 18.03.2017 - 10:17)
Что есть "текущий движок"?
Имеется ввиду тип таблицы, к которой данный запрос.



_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
S.Chushkin
Цитата
Имеется ввиду тип таблицы, к которой данный запрос.


Цитата (twin @ 18.03.2017 - 10:06)
...есть только текст запроса. Парсить его из запроса не вариант.

Не обойтись, насколько понимаю.
В одном запросе могут быть таблицы разных движков и получать инфу нужно о каждой в отдельности, чтобы выяснить, запрос поддерживает транзакцию на 100%, частично или совсем не поддерживает.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
twin
Блин, я загнался. Можно распарсить. И очень просто. Я чет не подумал о том, что запросам SELECT пофиг транзакции. Остается INSERT, UPDATE, DELETE, DROP и TRUNCATE. А это семечки. smile.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
S.Chushkin
Цитата (twin @ 18.03.2017 - 10:06)
Если таблица MyISAM :

$pdo->startTransaction();

$dbh->exec("DROP TABLE `table`");

$pdo->rollback();


Кстати, многие CREATE, ALTER и пр. в mySQL делают неявный COMMIT.
https://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html
Это так, для справки.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
Цитата (twin @ 18.03.2017 - 16:17)
Я чет не подумал о том, что запросам SELECT пофиг транзакции. Остается INSERT, UPDATE, DELETE, DROP и TRUNCATE. А это семечки. smile.gif

UPDATE, например, тоже JOIN-ы имеют wink.gif

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Invis1ble
... и селекты в транзакции завернуть можно biggrin.gif

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

twin
Цитата (S.Chushkin @ 18.03.2017 - 12:18)
UPDATE, например, тоже JOIN-ы имеют

Ну да. Забыл про них, спасибо. Добавим, не проблема.
Цитата (Invis1ble @ 18.03.2017 - 12:45)
... и селекты в транзакции завернуть можно
А это мне не важно. Чем селект в транзакции навредить может? smile.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Цитата (Santehnick @ 18.03.2017 - 13:38)
Начать с чтения мануала я думаю.
Молодец. Не поленился же.

Цитата (Santehnick @ 18.03.2017 - 13:38)
1. не существует метода PDO::startTransaction
Существует. В моем билдере существует. Только вот не надо к названиям переменных придираться. Тут суть важна, а не фантики.

Цитата (Santehnick @ 18.03.2017 - 13:38)
DROP/CREATE делают неявный коммит
Они меня не интересуют. Потому что опять же в моем билдере их нету. Позже может будут в другом компоненте, который за миграции будет отвечать. Я видел сообщение
Цитата (S.Chushkin @ 18.03.2017 - 12:17)
Кстати, многие CREATE, ALTER и пр. в mySQL делают неявный COMMIT.
https://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html
Это так, для справки.
и не прокомментировал только потому, что там ремарка "для справки".
Цитата (Santehnick @ 18.03.2017 - 13:38)
. PDO кидает эксепшен не потому что транзакция не поддерживается, а потому что пытаются откатить неактивную транзакцию.
И что это меняет? А вообще я имел ввиду это:
Цитата
Внимание
PDO проверяет возможность использования транзакций только на уровне драйвера. Если по каким-то причинам механизм транзакций недоступен, но сервер баз данных принял запрос на открытие транзакции, PDO::beginTransaction() вернет TRUE без ошибок.
В качестве примера можно попробовать использовать транзакции для изменения MyISAM таблиц базы данных MySQL.



_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
killer8080
Цитата (twin @ 18.03.2017 - 10:06)
Но для этого нужно знать имя таблицы. А его нет, есть только текст запроса. Парсить его из запроса не вариант.

для SELECT, DELETE, INSERT, REPLACE, UPDATE можно использовать EXPLAIN
twin
Цитата (killer8080 @ 18.03.2017 - 14:35)
для SELECT, DELETE, INSERT, REPLACE, UPDATE можно использовать EXPLAIN
Это для версии не ниже 5.6 Но не это главное. Эксплайн показывает не имя таблицы, а алиас, если он есть. Я это первым делом попробовал. smile.gif


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

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