005.phpt 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. --TEST--
  2. InterBase: transactions
  3. --SKIPIF--
  4. <?php include("skipif.inc"); ?>
  5. --FILE--
  6. <?php
  7. require("interbase.inc");
  8. ibase_connect($test_base);
  9. @ibase_query("create table test5 (i integer)");
  10. @ibase_query("delete from test5");
  11. ibase_close();
  12. echo "default transaction:\n";
  13. /*
  14. Difference between default and other transactions:
  15. default committed when you call ibase_close().
  16. Other transaction doing rollback.
  17. If you not open default transaction with
  18. ibase_trans, default transaction open
  19. when you call ibase_query(), ibase_prepare(),
  20. ibase_blob_create(), ibase_blob_import() first time.
  21. */
  22. /*
  23. simple default transaction test without ibase_trans()
  24. */
  25. ibase_connect($test_base);
  26. echo "empty table\n";
  27. /* out_table call ibase_query()
  28. and ibase_query() start default transaction */
  29. out_table("test5");
  30. /* in default transaction context */
  31. ibase_query("insert into test5 (i) values (1)");
  32. echo "one row\n";
  33. out_table("test5");
  34. ibase_rollback(); /* default rolled */
  35. echo "after rollback table empty again\n";
  36. out_table("test5"); /* started new default transaction */
  37. ibase_query("insert into test5 (i) values (2)");
  38. ibase_close(); /* commit here! */
  39. ibase_connect($test_base);
  40. echo "one row\n";
  41. out_table("test5");
  42. ibase_close();
  43. /*
  44. default transaction on default link
  45. First open transaction on link will be default.
  46. $tr_def_l1 may be omitted. All queryes without link and trans
  47. parameters run in this context
  48. */
  49. $link_def = ibase_connect($test_base);
  50. $tr_def_l1 = ibase_trans(IBASE_READ); /* here transaction start */
  51. /* all default */
  52. $res = ibase_query("select * from test5");
  53. echo "one row\n";
  54. out_result($res,"test5");
  55. ibase_free_result($res);
  56. /* specify transaction context... */
  57. $res = ibase_query($tr_def_l1, "select * from test5");
  58. echo "one row... again.\n";
  59. out_result($res,"test5");
  60. ibase_free_result($res);
  61. /* specify default transaction on link */
  62. $res = ibase_query($link_def, "select * from test5");
  63. echo "one row.\n";
  64. out_result($res,"test5");
  65. ibase_free_result($res);
  66. ibase_rollback($link_def); /* just for example */
  67. ibase_close();
  68. /*
  69. three transaction on default link
  70. */
  71. ibase_connect($test_base);
  72. $res = ibase_query("select * from test5");
  73. echo "one row\n";
  74. out_result($res,"test5");
  75. ibase_free_result($res);
  76. $tr_1 = ibase_query("SET TRANSACTION");
  77. $tr_2 = ibase_query("SET TRANSACTION READ ONLY");
  78. $tr_3 = ibase_trans(IBASE_READ+IBASE_COMMITTED+IBASE_REC_VERSION+IBASE_WAIT);
  79. $tr_4 = ibase_trans(IBASE_READ+IBASE_COMMITTED+IBASE_REC_NO_VERSION+IBASE_NOWAIT);
  80. /* insert in first transaction context... */
  81. /* as default */
  82. ibase_query("insert into test5 (i) values (3)");
  83. /* specify context */
  84. ibase_query($tr_1, "insert into test5 (i) values (4)");
  85. $res = ibase_query("select * from test5");
  86. echo "two rows\n";
  87. out_result($res,"test5");
  88. ibase_free_result($res);
  89. $res = ibase_query($tr_1, "select * from test5");
  90. echo "two rows again\n";
  91. out_result($res,"test5");
  92. ibase_free_result($res);
  93. ibase_commit();
  94. ibase_commit($tr_1);
  95. $tr_1 = ibase_trans();
  96. ibase_query($tr_1, "insert into test5 (i) values (5)");
  97. /* tr_2 is IBASE_READ + IBASE_CONCURRENCY + IBASE_WAIT */
  98. $res = ibase_query($tr_2, "select * from test5");
  99. echo "one row in second transaction\n";
  100. out_result($res,"test5");
  101. ibase_free_result($res);
  102. /* tr_3 is IBASE_COMMITTED + IBASE_REC_VERSION + IBASE_WAIT */
  103. $res = ibase_query($tr_3, "select * from test5");
  104. echo "three rows in third transaction\n";
  105. out_result($res,"test5");
  106. ibase_free_result($res);
  107. /* tr_4 IBASE_COMMITTED + IBASE_REC_NO_VERSION + IBASE_NOWAIT */
  108. $res = ibase_query($tr_4, "select * from test5");
  109. echo "three rows in fourth transaction with deadlock\n";
  110. out_result_trap_error($res,"test5");
  111. ibase_free_result($res);
  112. ibase_rollback($tr_1);
  113. ibase_close();
  114. /*
  115. transactions on second link
  116. */
  117. $link_1 = ibase_pconnect($test_base);
  118. $link_2 = ibase_pconnect($test_base);
  119. $tr_1 = ibase_trans(IBASE_DEFAULT, $link_2); /* this default transaction also */
  120. $tr_2 = ibase_trans(IBASE_COMMITTED, $link_2);
  121. $res = ibase_query($tr_1, "select * from test5");
  122. echo "three rows\n";
  123. out_result($res,"test5");
  124. ibase_free_result($res);
  125. ibase_query($tr_1, "insert into test5 (i) values (5)");
  126. $res = ibase_query($tr_1, "select * from test5");
  127. echo "four rows\n";
  128. out_result($res,"test5");
  129. ibase_free_result($res);
  130. ibase_commit($tr_1);
  131. $res = ibase_query($tr_2, "select * from test5");
  132. echo "four rows again\n";
  133. out_result($res,"test5");
  134. ibase_free_result($res);
  135. ibase_close($link_1);
  136. ibase_close($link_2);
  137. echo "end of test\n";
  138. ?>
  139. --EXPECTF--
  140. default transaction:
  141. empty table
  142. --- test5 ---
  143. ---
  144. one row
  145. --- test5 ---
  146. 1
  147. ---
  148. after rollback table empty again
  149. --- test5 ---
  150. ---
  151. one row
  152. --- test5 ---
  153. 2
  154. ---
  155. one row
  156. --- test5 ---
  157. 2
  158. ---
  159. one row... again.
  160. --- test5 ---
  161. 2
  162. ---
  163. one row.
  164. --- test5 ---
  165. 2
  166. ---
  167. one row
  168. --- test5 ---
  169. 2
  170. ---
  171. two rows
  172. --- test5 ---
  173. 2
  174. 3
  175. ---
  176. two rows again
  177. --- test5 ---
  178. 2
  179. 4
  180. ---
  181. one row in second transaction
  182. --- test5 ---
  183. 2
  184. ---
  185. three rows in third transaction
  186. --- test5 ---
  187. 2
  188. 3
  189. 4
  190. ---
  191. three rows in fourth transaction with deadlock
  192. --- test5 ---
  193. 2
  194. 3
  195. 4
  196. errmsg [lock conflict on no wait transaction deadlock %a]
  197. ---
  198. three rows
  199. --- test5 ---
  200. 2
  201. 3
  202. 4
  203. ---
  204. four rows
  205. --- test5 ---
  206. 2
  207. 3
  208. 4
  209. 5
  210. ---
  211. four rows again
  212. --- test5 ---
  213. 2
  214. 3
  215. 4
  216. 5
  217. ---
  218. end of test