[PDO] Firebird, транзакции. Странное поведение.

DavyJohnes
На сайте с 05.01.2011
Offline
84
678

Здравствуйте!

У меня PHP 5.4 на Debian Testing. Заметил странное поведение pdo_firebird.

$pdo = new \PDO('firebird:dbname=localhost:basename', 'SYSDBA', 'masterkey'); //$pdo->inTransaction() = false

$pdo->prepare('SELECT * FROM tbl'); //$pdo->inTransaction() = true
$pdo->execute(); //$pdo->inTransaction() = true

$pdo->beginTransaction(); // Exception will be thrown

Почему так? Почему транзакция сама открывается при подготовке SELECT запроса? И мало того, не закрывается при завершении запроса, хотя по логике должен быть AUTOCOMMITT. В то время как с MySQL:

$pdo = new \PDO('mysql:dbname=mydb;host=localhost', 'root', 'rootpass'); //$pdo->inTransaction() = false

$pdo->prepare('SELECT * FROM tbl'); //$pdo->inTransaction() = false
$pdo->execute(); //$pdo->inTransaction() = false

$pdo->beginTransaction(); // OK

Может сталкивался кто с таким?

https://handy-tools.io (https://handy-tools.io) - Набор полезных утилит для всех!
N
На сайте с 06.05.2007
Offline
419
#1
DavyJohnes:

Почему так? Почему транзакция сама открывается при подготовке SELECT запроса?

а почему нет? "подготовка" для PDO приводит к реальному обращению к серверу. то есть, транзакция началась.

попробуйте вручную управлять автокоммитом :

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1)

и выключать его, если делаете beginTransaction. Так было бы логично. Программисты не любят сюрпризы и не тестируют их.

Кнопка вызова админа ()
DavyJohnes
На сайте с 05.01.2011
Offline
84
#2
netwind:
а почему нет? "подготовка" для PDO приводит к реальному обращению к серверу. то есть, транзакция началась.

попробуйте вручную управлять автокоммитом :
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1)
и выключать его, если делаете beginTransaction. Так было бы логично. Программисты не любят сюрпризы и не тестируют их.

Ну и если по Вашей логике, то почему в случае с MySQL, транзакция даже не начинается?

Пробовал вручную указывать автокоммитт - не помогает. После $sth->execute(), транзакция остается открытой.

N
На сайте с 06.05.2007
Offline
419
#3
DavyJohnes:
Ну и если по Вашей логике, то почему в случае с MySQL, транзакция даже не начинается?

Так исходники и почитайте. Значит так решил программист.

вообще, в старых версиях mysql не было prepared statements и надстройки PDO оболочки их имитировали не отправляя запросы к серверу.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий