pdo_mysql_rollback.phpt 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. --TEST--
  2. PDO::rollBack()
  3. --SKIPIF--
  4. <?php
  5. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
  6. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  7. MySQLPDOTest::skip();
  8. $db = MySQLPDOTest::factory();
  9. if (false == MySQLPDOTest::detect_transactional_mysql_engine($db))
  10. die("skip Transactional engine not found");
  11. ?>
  12. --FILE--
  13. <?php
  14. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  15. $db = MySQLPDOTest::factory();
  16. MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db));
  17. $db->beginTransaction();
  18. $row = $db->query('SELECT COUNT(*) AS _num FROM test')->fetch(PDO::FETCH_ASSOC);
  19. $num = $row['_num'];
  20. $db->query("INSERT INTO test(id, label) VALUES (100, 'z')");
  21. $num++;
  22. $row = $db->query('SELECT COUNT(*) AS _num FROM test')->fetch(PDO::FETCH_ASSOC);
  23. if ($row['_num'] != $num)
  24. printf("[001] INSERT has failed, test will fail\n");
  25. $db->rollBack();
  26. $num--;
  27. $row = $db->query('SELECT COUNT(*) AS _num FROM test')->fetch(PDO::FETCH_ASSOC);
  28. if ($row['_num'] != $num)
  29. printf("[002] ROLLBACK has failed\n");
  30. $db->beginTransaction();
  31. $db->query("INSERT INTO test(id, label) VALUES (100, 'z')");
  32. $db->query('DROP TABLE IF EXISTS test2');
  33. $db->query('CREATE TABLE test2(id INT)');
  34. $num++;
  35. $db->rollBack();
  36. $row = $db->query('SELECT COUNT(*) AS _num FROM test')->fetch(PDO::FETCH_ASSOC);
  37. if ($row['_num'] != $num)
  38. printf("[002] ROLLBACK should have no effect because of the implicit COMMIT
  39. triggered by DROP/CREATE TABLE\n");
  40. $db->query('DROP TABLE IF EXISTS test2');
  41. $db->query('CREATE TABLE test2(id INT) ENGINE=MyISAM');
  42. $db->beginTransaction();
  43. $db->query('INSERT INTO test2(id) VALUES (1)');
  44. $db->rollBack();
  45. $row = $db->query('SELECT COUNT(*) AS _num FROM test2')->fetch(PDO::FETCH_ASSOC);
  46. if ($row['_num'] != 1)
  47. printf("[003] ROLLBACK should have no effect\n");
  48. $db->query('DROP TABLE IF EXISTS test2');
  49. $db->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
  50. $db->beginTransaction();
  51. $db->query('DELETE FROM test');
  52. $db->rollBack();
  53. var_dump($db->getAttribute(PDO::ATTR_AUTOCOMMIT));
  54. $db->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
  55. $db->beginTransaction();
  56. $db->query('DELETE FROM test');
  57. $db->rollBack();
  58. var_dump($db->getAttribute(PDO::ATTR_AUTOCOMMIT));
  59. $db->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
  60. $db->beginTransaction();
  61. $db->query('DELETE FROM test');
  62. $db->commit();
  63. var_dump($db->getAttribute(PDO::ATTR_AUTOCOMMIT));
  64. $db->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
  65. $db->beginTransaction();
  66. $db->query('DELETE FROM test');
  67. $db->commit();
  68. var_dump($db->getAttribute(PDO::ATTR_AUTOCOMMIT));
  69. print "done!";
  70. ?>
  71. --CLEAN--
  72. <?php
  73. require dirname(__FILE__) . '/mysql_pdo_test.inc';
  74. $db = MySQLPDOTest::factory();
  75. $db->exec('DROP TABLE IF EXISTS test');
  76. $db->exec('DROP TABLE IF EXISTS test2');
  77. ?>
  78. --EXPECT--
  79. int(1)
  80. int(0)
  81. int(1)
  82. int(0)
  83. done!