Откат транзакции не работает

Я сделал обертку базы данных с дополнительной функциональностью вокруг системы PDO (да, я знаю обертку вокруг обертки, но это - просто PDO с некоторой дополнительной функциональностью). Но я заметил проблему.

Следующее не работает как он, должен быть:

<?php
var_dump($db->beginTransaction());

$db->query('
 INSERT INTO test
 (data) VALUES (?)
 ;',
 array(
  'Foo'
 )
);
print_r($db->query('
 SELECT *
 FROM test
 ;'
)->fetchAll());

var_dump($db->rollBack());

print_r($db->query('
 SELECT *
 FROM test
 ;'
)->fetchAll());
?>

Шоу var_dump, что beginTransaction и функции отката возвращают true, таким образом, никакие ошибки.

Я ожидал, что первый вызов print_r показывает, что массив объектов N и второго вызова показывает N-1 объекты. Но это issn't верный, они оба шоу то же количество объектов.

Мой $db-> запрос (<sql>, <значения>) не называют ничто иное затем, что $pdo-> готовятся (<sql>)-> выполняются (<оценивает>) (с дополнительной обработкой ошибок, конечно).

Таким образом, я думаю, или система транзакции MySQL не работает, или implenmentaties PDO не работает, или я вижу что-то не так.

Кто-либо знает, какова проблема?

5
задан VDVLeon 17 February 2010 в 15:10
поделиться

4 ответа

GetFurePath выполняет работу, за исключением разности случаев ( Path.GetFurePath («тест»)! = Path.GetFurePath («ТЕСТ») ) и завершающей косой черты. Таким образом, следующий код должен работать нормально:

String.Compare(
    Path.GetFullPath(path1).TrimEnd('\\'),
    Path.GetFullPath(path2).TrimEnd('\\'), 
    StringComparison.InvariantCultureIgnoreCase)

Или, если вы хотите начать с ПО Info :

String.Compare(
    dirinfo1.FullName.TrimEnd('\\'),
    dirinfo2.FullName.TrimEnd('\\'), 
    StringComparison.InvariantCultureIgnoreCase)
-121--884657-

Не ответ на ваш вопрос, а забавный факт.

Microsoft-реализация компилятора C # на самом деле не может обработать try-catch-finally. Когда мы разбираем код

try { Foo() } 
catch(Exception e) { Bar(e); }
finally { Blah(); }

, мы на самом деле делаем вид, что код был написан

try 
{
   try { Foo(); }
   catch(Exception e) { Bar(e); }
}
finally { Blah(); }

Таким образом, остальная часть компилятора - семантический анализатор, средство проверки достижимости, генератор кода и так далее - должна иметь дело только с try-catch и try-finally, никогда не try-catch-finally. Немного глупой ранней трансформации на мой взгляд, но она работает.

-121--3428874-

Проверьте, равен ли тип базы данных innoDB. Одним словом, необходимо проверить, поддерживает ли база данных транзакции.

14
ответ дан 18 December 2019 в 06:50
поделиться

Две возможные проблемы:

  1. Это таблица MyISAM, которая не поддерживает транзакции. Используйте InnoDB.

  2. Убедитесь, что автоматическая фиксация выключена.

http://www.php.net/manual/en/pdo.transactions.php

4
ответ дан 18 December 2019 в 06:50
поделиться

Я ввожу это как ответ, поскольку комментарий слишком мал, чтобы содержать следующее:

PDO - это просто оболочка для различных библиотек интерфейса баз данных нижнего уровня. Если низкоуровневая библиотека не жалуется, будет PDO. Поскольку MySQL поддерживает транзакции, никакие транзакционные операции не вернут синтаксическую ошибку или что-то еще. Вы можете использовать таблицы MyISAM в транзакциях, но любые операции, выполняемые с ними, будут выполняться так, как если бы автоматическая фиксация все еще была активна:

mysql> create table myisamtable (x int) engine=myisam;
Query OK, 0 rows affected (0.00 sec)

mysql> create table innodbtable (x int) engine=innodb;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into myisamtable (x) values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into innodbtable (x) values (2);
Query OK, 1 row affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from myisamtable;
+------+
| x    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select * from innodbtable;
Empty set (0.00 sec)

mysql>

Как видите, даже если транзакция была активной, и некоторые действия были выполнены с таблицей MyISAM , ошибок не было.

3
ответ дан 18 December 2019 в 06:50
поделиться

MySQL не поддерживает транзакции с типом таблицы MyISAM, который, к сожалению, является типом таблицы по умолчанию.

Если вам нужны транзакции, вы должны переключиться на тип таблицы InnoDB.

2
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: