1 21 22 package org.apache.derbyTesting.functionTests.tests.jdbcapi; 23 24 import java.sql.Connection ; 25 import java.sql.PreparedStatement ; 26 import java.sql.ResultSet ; 27 import java.sql.SQLException ; 28 import java.sql.SQLWarning ; 29 import java.sql.Statement ; 30 import java.util.ArrayList ; 31 import java.util.Iterator ; 32 import java.util.Properties ; 33 34 import javax.sql.XAConnection ; 35 import javax.sql.XADataSource ; 36 import javax.transaction.xa.XAException ; 37 import javax.transaction.xa.XAResource ; 38 import javax.transaction.xa.Xid ; 39 40 import org.apache.derby.tools.JDBCDisplayUtil; 41 import org.apache.derby.tools.ij; 42 import org.apache.derbyTesting.functionTests.util.TestUtil; 43 import org.apache.derbyTesting.functionTests.util.XATestUtil; 44 45 49 public class XATest { 50 51 54 public static void main(String [] args) throws Exception { 55 ij.getPropertyArg(args); 56 Connection dmc = ij.startJBMS(); 57 58 showHoldStatus("initial ", dmc); 59 60 XATestUtil.createXATransactionView(dmc); 61 dmc.close(); 62 63 XADataSource dsx = TestUtil.getXADataSource(cleanProperties()); 64 65 singleConnectionOnePhaseCommit(dsx); 67 xaShutdown(); 68 interleavingTransactions(dsx); 69 70 xaShutdown(); 71 72 noTransaction(dsx); 74 75 morph(dsx); 77 78 derby966(dsx); 80 81 Connection dmc2 = ij.startJBMS(); 83 cleanUp(dmc2); 84 85 System.out.println("XATest complete"); 86 } 87 88 93 private static Properties cleanProperties() { 94 Properties dsAttrs = new Properties (); 95 dsAttrs.setProperty("databaseName", "wombat"); 96 return dsAttrs; 97 } 98 99 102 private static void xaShutdown() { 103 104 Properties dsAttrs = cleanProperties(); 105 106 if (TestUtil.isEmbeddedFramework()) 107 dsAttrs.put("shutdownDatabase", "shutdown"); 108 else 109 dsAttrs.put("connectionAttributes", "shutdown=true"); 110 111 XADataSource dsx = TestUtil.getXADataSource(dsAttrs); 112 113 try { 114 dsx.getXAConnection().getConnection(); 115 } catch (SQLException sqle) { 116 if ("08006".equals(sqle.getSQLState())) 117 return; 118 TestUtil.dumpSQLExceptions(sqle); 119 } 120 System.out.println("FAIL: no exception on shutdown"); 121 } 122 123 126 127 150 private static void singleConnectionOnePhaseCommit(XADataSource xads) { 151 System.out.println("singleConnectionOnePhaseCommit"); 152 try { 153 XAConnection xac = xads.getXAConnection(); 154 155 XAResource xar = xac.getXAResource(); 156 157 Xid xid = XATestUtil.getXid(0, 32, 46); 158 159 xar.start(xid, XAResource.TMNOFLAGS); 160 161 Connection conn = xac.getConnection(); 162 163 showHoldStatus("XA ", conn); 164 165 Statement s = conn.createStatement(); 166 showHoldStatus("XA ", s); 167 168 s.execute("create table foo (a int)"); 169 s.executeUpdate("insert into foo values (0)"); 170 171 ResultSet rs = s.executeQuery("select * from foo"); 172 JDBCDisplayUtil.DisplayResults(System.out, rs, conn); 173 rs.close(); 174 175 XATestUtil.showXATransactionView(conn); 176 177 s.close(); 178 xar.end(xid, XAResource.TMSUCCESS); 179 180 xar.commit(xid, true); 182 183 conn.close(); 184 xac.close(); 185 186 } catch (SQLException sqle) { 187 TestUtil.dumpSQLExceptions(sqle); 188 sqle.printStackTrace(System.out); 189 } catch (XAException e) { 190 XATestUtil.dumpXAException("singleConnectionOnePhaseCommit", e); 191 } 192 } 193 194 266 private static void interleavingTransactions(XADataSource xads) { 267 System.out.println("interleavingTransactions"); 268 try { 269 XAConnection xac = xads.getXAConnection("sku", "testxa"); 270 XAResource xar = xac.getXAResource(); 271 272 Xid xid1 = XATestUtil.getXid(1, 93, 18); 273 Xid xid2 = XATestUtil.getXid(2, 45, 77); 274 275 xar.start(xid1, XAResource.TMNOFLAGS); 276 277 Connection conn = xac.getConnection(); 278 279 Statement s = conn.createStatement(); 280 s.executeUpdate("insert into APP.foo values (1)"); 281 xar.end(xid1, XAResource.TMSUSPEND); 282 283 xar.start(xid2, XAResource.TMNOFLAGS); 284 s.executeUpdate("insert into APP.foo values (2)"); 285 xar.end(xid2, XAResource.TMSUSPEND); 286 287 xar.start(xid1, XAResource.TMRESUME); 288 s.executeUpdate("insert into APP.foo values (3)"); 289 xar.end(xid1, XAResource.TMSUSPEND); 290 291 xar.start(xid2, XAResource.TMRESUME); 292 s.executeUpdate("insert into APP.foo values (4)"); 293 294 XATestUtil.showXATransactionView(conn); 295 296 try { 299 xar.prepare(xid1); 300 System.out.println("FAIL - prepare on suspended transaction"); 301 } catch (XAException e) { 302 if (e.errorCode != XAException.XAER_PROTO) 303 XATestUtil.dumpXAException( 304 "FAIL - prepare on suspended transaction", e); 305 306 } 307 308 XATestUtil.showXATransactionView(conn); 310 311 xar.end(xid2, XAResource.TMSUCCESS); 312 313 xar.end(xid1, XAResource.TMSUCCESS); 314 315 xar.prepare(xid1); 316 xar.prepare(xid2); 317 318 XATestUtil.showXATransactionView(conn); 320 321 Xid [] recoveredStart = xar.recover(XAResource.TMSTARTRSCAN); 322 System.out.println("recovered start " + recoveredStart.length); 323 Xid [] recovered = xar.recover(XAResource.TMNOFLAGS); 324 System.out.println("recovered " + recovered.length); 325 Xid [] recoveredEnd = xar.recover(XAResource.TMENDRSCAN); 326 System.out.println("recovered end " + recoveredEnd.length); 327 328 for (int i = 0; i < recoveredStart.length; i++) { 329 Xid xid = recoveredStart[i]; 330 if (xid.getFormatId() == 1) { 331 xar.commit(xid, false); 333 } else if (xid.getFormatId() == 2) { 334 xar.rollback(xid); 335 } else { 336 System.out.println("FAIL: unknown xact"); 337 } 338 } 339 340 Xid xid3 = XATestUtil.getXid(3, 2, 101); 342 xar.start(xid3, XAResource.TMNOFLAGS); 343 XATestUtil.showXATransactionView(conn); 344 ResultSet rs = s.executeQuery("select * from APP.foo"); 345 JDBCDisplayUtil.DisplayResults(System.out, rs, conn); 346 rs.close(); 347 xar.end(xid3, XAResource.TMSUCCESS); 348 349 int pr = xar.prepare(xid3); 350 if (pr != XAResource.XA_RDONLY) 351 System.out.println("FAIL - prepare on read only xact returned " 352 + pr); 353 354 try { 355 xar.commit(xid3, true); 356 System.out.println("FAIL - 2pc commit on read-only xact"); 357 } catch (XAException e) { 358 if (e.errorCode != XAException.XAER_NOTA) 359 throw e; 360 } 361 362 s.close(); 363 conn.close(); 364 xac.close(); 365 } catch (SQLException sqle) { 366 TestUtil.dumpSQLExceptions(sqle); 367 } catch (XAException e) { 368 XATestUtil.dumpXAException("interleavingTransactions", e); 369 } 370 } 371 372 399 private static void noTransaction(XADataSource xads) { 400 System.out.println("noTransaction"); 401 try { 402 XAConnection xac = xads.getXAConnection(); 403 XAResource xar = xac.getXAResource(); 404 405 Xid xid11 = XATestUtil.getXid(11, 3, 128); 406 407 try { 408 xar.start(xid11, XAResource.TMJOIN); 409 } catch (XAException e) { 410 if (e.errorCode != XAException.XAER_NOTA) 411 throw e; 412 } 413 414 try { 415 xar.start(xid11, XAResource.TMRESUME); 416 } catch (XAException e) { 417 if (e.errorCode != XAException.XAER_NOTA) 418 throw e; 419 } 420 421 try { 422 xar.end(xid11, XAResource.TMSUCCESS); 423 } catch (XAException e) { 424 if (e.errorCode != XAException.XAER_NOTA) 425 throw e; 426 } 427 try { 428 xar.end(xid11, XAResource.TMFAIL); 429 } catch (XAException e) { 430 if (e.errorCode != XAException.XAER_NOTA) 431 throw e; 432 } 433 434 try { 435 xar.end(xid11, XAResource.TMSUSPEND); 436 } catch (XAException e) { 437 if (e.errorCode != XAException.XAER_NOTA) 438 throw e; 439 } 440 441 try { 442 xar.prepare(xid11); 443 } catch (XAException e) { 444 if (e.errorCode != XAException.XAER_NOTA) 445 throw e; 446 } 447 try { 448 xar.commit(xid11, false); 449 } catch (XAException e) { 450 if (e.errorCode != XAException.XAER_NOTA) 451 throw e; 452 } 453 try { 454 xar.commit(xid11, true); 455 } catch (XAException e) { 456 if (e.errorCode != XAException.XAER_NOTA) 457 throw e; 458 } 459 try { 460 xar.rollback(xid11); 461 } catch (XAException e) { 462 if (e.errorCode != XAException.XAER_NOTA) 463 throw e; 464 } 465 try { 466 xar.forget(xid11); 467 } catch (XAException e) { 468 if (e.errorCode != XAException.XAER_NOTA) 469 throw e; 470 } 471 } catch (SQLException e) { 472 TestUtil.dumpSQLExceptions(e); 473 } catch (XAException e) { 474 XATestUtil.dumpXAException("noTransaction", e); 475 } 476 } 477 478 481 private static void morph(XADataSource xads) { 482 System.out.println("morph"); 483 484 try { 485 XAConnection xac = xads.getXAConnection(); 486 487 XAResource xar = xac.getXAResource(); 488 489 Connection conn = xac.getConnection(); 490 491 497 conn.setAutoCommit(false); 498 Statement s = conn.createStatement(); 499 s.executeUpdate("insert into APP.foo values (2001)"); 500 XATestUtil.showXATransactionView(conn); 501 conn.commit(); 502 503 509 510 conn.setAutoCommit(true); 511 s.executeUpdate("insert into APP.foo values (2002)"); 512 XATestUtil.showXATransactionView(conn); 513 514 520 521 Xid xid = XATestUtil.getXid(1001, 66, 13); 522 xar.start(xid, XAResource.TMNOFLAGS); 523 XATestUtil.showXATransactionView(conn); 524 s.executeUpdate("insert into APP.foo values (2003)"); 525 526 536 try { 537 conn.commit(); 538 System.out.println("FAIL: commit allowed in global xact"); 539 } catch (SQLException e) { 540 } 541 542 try { 543 conn.rollback(); 544 System.out.println("FAIL: roll back allowed in global xact"); 545 } catch (SQLException e) { 546 } 547 try { 548 conn.setAutoCommit(true); 549 System.out 550 .println("FAIL: setAutoCommit(true) allowed "+ 551 "in global xact"); 552 } catch (SQLException e) { 553 } 554 try { 555 conn.setSavepoint(); 556 System.out 557 .println("FAIL: setSavepoint() allowed in global xact"); 558 } catch (SQLException e) {} 559 try { 560 conn.setSavepoint("badsavepoint"); 561 System.out 562 .println("FAIL: setAutoCommit(String) allowed in "+ 563 "global xact"); 564 } catch (SQLException e) {} 565 566 conn.setAutoCommit(false); 567 568 571 if (TestUtil.isDerbyNetClientFramework()) { s.executeQuery("select * from APP.foo where A >= 2000").close(); 573 System.out.println("OK: query with holdable statement"); 574 } 575 s.close(); 576 577 578 s = conn.createStatement(); 579 boolean holdable = s.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT; 580 System.out.println("Statement created in global has holdabilty: " 581 + holdable); 582 583 588 ResultSet rs = s 589 .executeQuery("select * from APP.foo where A >= 2000"); 590 JDBCDisplayUtil.DisplayResults(System.out, rs, conn); 591 rs.close(); 592 593 xar.end(xid, XAResource.TMSUCCESS); 594 xar.prepare(xid); 595 596 600 try { 601 xar.start(xid, XAResource.TMNOFLAGS); 602 System.out.println("FAIL - start with duplicate XID"); 603 } catch (XAException e) { 604 if (e.errorCode != XAException.XAER_DUPID) 605 throw e; 606 } 607 608 618 619 Xid xid2 = XATestUtil.getXid(1002, 23, 3); 620 xar.start(xid2, XAResource.TMNOFLAGS); 621 try { 622 conn.commit(); 623 System.out.println("FAIL: commit allowed in global xact"); 624 } catch (SQLException e) { 625 } 626 try { 627 conn.rollback(); 628 System.out.println("FAIL: roll back allowed in global xact"); 629 } catch (SQLException e) { 630 } 631 try { 632 conn.setAutoCommit(true); 633 System.out 634 .println("FAIL: setAutoCommit(true) allowed in global xact"); 635 } catch (SQLException e) { 636 } 637 conn.setAutoCommit(false); 638 639 xar.end(xid2, XAResource.TMSUSPEND); 640 641 659 conn = xac.getConnection(); 660 s = conn.createStatement(); 661 s.executeUpdate("insert into APP.foo values (2005)"); 662 conn.commit(); 663 conn.setAutoCommit(false); 664 s.executeUpdate("insert into APP.foo values (2006)"); 665 conn.rollback(); 666 s.executeUpdate("insert into APP.foo values (2007)"); 667 conn.commit(); 668 669 XATestUtil.showXATransactionView(conn); 670 677 xar.commit(xid, false); 678 xar.end(xid2, XAResource.TMSUCCESS); 679 xar.rollback(xid2); 680 681 XATestUtil.showXATransactionView(conn); 682 rs = s.executeQuery("select * from APP.foo where A >= 2000"); 683 JDBCDisplayUtil.DisplayResults(System.out, rs, conn); 684 rs.close(); 685 686 conn.close(); 687 688 695 conn = xac.getConnection(); 696 conn.setAutoCommit(false); 697 s = conn.createStatement(); 698 s.executeUpdate("delete from app.foo"); 699 rs = s.executeQuery("select * from APP.foo"); 700 JDBCDisplayUtil.DisplayResults(System.out, rs, conn); 701 rs.close(); 702 703 if (TestUtil.isDerbyNetClientFramework()) { 705 System.out.println("DERBY-1004 Call conn.rollback to avoid exception with client"); 706 conn.rollback(); 707 } 708 711 conn = xac.getConnection(); 712 conn.setAutoCommit(false); 713 s = conn.createStatement(); 714 rs = s.executeQuery("select * from APP.foo where A >= 2000"); 715 JDBCDisplayUtil.DisplayResults(System.out, rs, conn); 716 rs.close(); 717 718 725 Xid xid3 = XATestUtil.getXid(1003, 27, 9); 726 try { 727 xar.start(xid3, XAResource.TMNOFLAGS); 728 System.out.println("FAIL XAResource.start on a global transaction with an active local transaction (autocommit false)"); 729 } catch (XAException xae) { 730 if (xae.errorCode != XAException.XAER_OUTSIDE) 731 throw xae; 732 System.out.println("Correct XAException on starting a global transaction with an active local transaction (autocommit false)"); 733 } 734 conn.commit(); 735 xar.start(xid3, XAResource.TMNOFLAGS); 736 737 741 if (TestUtil.isDerbyNetClientFramework()) { 742 System.out.println("DERBY-341 - Client skipping XAConnection with active local transaction"); 743 } else { 744 try { 745 xac.getConnection(); 746 System.out 747 .println("FAIL: getConnection with active global xact"); 748 } catch (SQLException sqle) { 749 TestUtil.dumpSQLExceptions(sqle, true); 750 } 751 } 752 764 s = conn.createStatement(); 765 s.executeUpdate("delete from APP.foo"); 766 rs = s.executeQuery("select * from APP.foo where A >= 2000"); 767 JDBCDisplayUtil.DisplayResults(System.out, rs, conn); 768 rs.close(); 769 try { 770 xar.end(xid3, XAResource.TMFAIL); 771 } catch (XAException e) { 772 if (e.errorCode != XAException.XA_RBROLLBACK) 773 throw e; 774 } 775 xar.rollback(xid3); 776 777 conn = xac.getConnection(); 778 s = conn.createStatement(); 779 rs = s.executeQuery("select * from APP.foo where A >= 2000"); 780 JDBCDisplayUtil.DisplayResults(System.out, rs, conn); 781 rs.close(); 782 783 s.close(); 784 conn.close(); 785 786 } catch (SQLException e) { 787 TestUtil.dumpSQLExceptions(e); 788 e.printStackTrace(System.out); 789 } catch (XAException e) { 790 XATestUtil.dumpXAException("morph", e); 791 } 792 793 } 794 795 799 private static void derby966(XADataSource xads) 800 { 801 System.out.println("derby966"); 802 803 try { 804 XAConnection xac = xads.getXAConnection(); 805 XAResource xar = xac.getXAResource(); 806 807 Xid xid = XATestUtil.getXid(996, 9, 48); 808 809 Connection conn = xac.getConnection(); 810 811 814 showHoldStatus("Local ", conn); 815 816 Statement sdh = conn.createStatement(); 817 showHoldStatus("Local(held) default ", sdh); 818 checkHeldRS(conn, sdh, sdh.executeQuery("select * from app.foo")); 819 PreparedStatement psdh = conn.prepareStatement("SELECT * FROM APP.FOO"); 820 PreparedStatement psdh_d = conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99"); 821 showHoldStatus("Local(held) default Prepared", psdh); 822 checkHeldRS(conn, psdh, psdh.executeQuery()); 823 824 Statement shh = conn.createStatement( 825 ResultSet.TYPE_FORWARD_ONLY, 826 ResultSet.CONCUR_READ_ONLY, 827 ResultSet.HOLD_CURSORS_OVER_COMMIT); 828 showHoldStatus("Local(held) held ", shh); 829 checkHeldRS(conn, shh, shh.executeQuery("select * from app.foo")); 830 PreparedStatement pshh = 831 conn.prepareStatement("SELECT * FROM APP.FOO", 832 ResultSet.TYPE_FORWARD_ONLY, 833 ResultSet.CONCUR_READ_ONLY, 834 ResultSet.HOLD_CURSORS_OVER_COMMIT); 835 PreparedStatement pshh_d = 836 conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99", 837 ResultSet.TYPE_FORWARD_ONLY, 838 ResultSet.CONCUR_READ_ONLY, 839 ResultSet.HOLD_CURSORS_OVER_COMMIT); 840 showHoldStatus("Local(held) held Prepared", pshh); 841 checkHeldRS(conn, pshh, pshh.executeQuery()); 842 843 Statement sch = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, 844 ResultSet.CONCUR_READ_ONLY, 845 ResultSet.CLOSE_CURSORS_AT_COMMIT); 846 showHoldStatus("Local(held) close ", sch); 847 checkHeldRS(conn, sch, sch.executeQuery("select * from app.foo")); 848 PreparedStatement psch = 849 conn.prepareStatement("SELECT * FROM APP.FOO", 850 ResultSet.TYPE_FORWARD_ONLY, 851 ResultSet.CONCUR_READ_ONLY, 852 ResultSet.CLOSE_CURSORS_AT_COMMIT); 853 PreparedStatement psch_d = 854 conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99", 855 ResultSet.TYPE_FORWARD_ONLY, 856 ResultSet.CONCUR_READ_ONLY, 857 ResultSet.CLOSE_CURSORS_AT_COMMIT); 858 showHoldStatus("Local(held) close Prepared", psch); 859 checkHeldRS(conn, psch, psch.executeQuery()); 860 861 conn.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT); 863 864 Statement sdc = conn.createStatement(); 865 showHoldStatus("Local(close) default ", sdc); 866 checkHeldRS(conn, sdc, sdc.executeQuery("select * from app.foo")); 867 PreparedStatement psdc = conn.prepareStatement("SELECT * FROM APP.FOO"); 868 PreparedStatement psdc_d = conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99"); 869 showHoldStatus("Local(close) default Prepared", psdc); 870 checkHeldRS(conn, psdc, psdc.executeQuery()); 871 872 Statement shc = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, 873 ResultSet.CONCUR_READ_ONLY, 874 ResultSet.HOLD_CURSORS_OVER_COMMIT); 875 showHoldStatus("Local(close) held ", shc); 876 checkHeldRS(conn, shc, shc.executeQuery("select * from app.foo")); 877 PreparedStatement pshc = 878 conn.prepareStatement("SELECT * FROM APP.FOO", 879 ResultSet.TYPE_FORWARD_ONLY, 880 ResultSet.CONCUR_READ_ONLY, 881 ResultSet.HOLD_CURSORS_OVER_COMMIT); 882 PreparedStatement pshc_d = 883 conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99", 884 ResultSet.TYPE_FORWARD_ONLY, 885 ResultSet.CONCUR_READ_ONLY, 886 ResultSet.HOLD_CURSORS_OVER_COMMIT); 887 showHoldStatus("Local(close) held Prepared", pshc); 888 checkHeldRS(conn, pshc, pshc.executeQuery()); 889 890 Statement scc = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, 891 ResultSet.CONCUR_READ_ONLY, 892 ResultSet.CLOSE_CURSORS_AT_COMMIT); 893 showHoldStatus("Local(close) close ", scc); 894 checkHeldRS(conn, scc, scc.executeQuery("select * from app.foo")); 895 PreparedStatement pscc = 896 conn.prepareStatement("SELECT * FROM APP.FOO", 897 ResultSet.TYPE_FORWARD_ONLY, 898 ResultSet.CONCUR_READ_ONLY, 899 ResultSet.CLOSE_CURSORS_AT_COMMIT); 900 PreparedStatement pscc_d = 901 conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99", 902 ResultSet.TYPE_FORWARD_ONLY, 903 ResultSet.CONCUR_READ_ONLY, 904 ResultSet.CLOSE_CURSORS_AT_COMMIT); 905 showHoldStatus("Local(close) close Prepared", pscc); 906 checkHeldRS(conn, pscc, pscc.executeQuery()); 907 908 conn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT); 910 911 ResultSet rs = sdh.executeQuery("SELECT * FROM APP.FOO"); 912 rs.next(); System.out.println("BGBC " + rs.getInt(1)); 913 conn.commit(); 914 rs.next(); System.out.println("BGAC " + rs.getInt(1)); 915 rs.close(); 916 917 rs = sdh.executeQuery("SELECT * FROM APP.FOO"); 919 920 924 System.out.println("START GLOBAL TRANSACTION"); 925 xar.start(xid, XAResource.TMNOFLAGS); 927 928 sdh.executeUpdate("DELETE FROM APP.FOO where A < -99"); 930 shh.executeUpdate("DELETE FROM APP.FOO where A < -99"); 931 sch.executeUpdate("DELETE FROM APP.FOO where A < -99"); 932 933 ArrayList openRS = new ArrayList (); 934 935 openRS.add(sdh.executeQuery("SELECT * FROM APP.FOO")); 939 openRS.add(shh.executeQuery("SELECT * FROM APP.FOO")); 940 openRS.add(sch.executeQuery("SELECT * FROM APP.FOO")); 941 942 943 openRS.add(psdh.executeQuery()); 946 openRS.add(pshh.executeQuery()); 947 openRS.add(psch.executeQuery()); 948 949 psdh_d.executeUpdate(); 951 pshh_d.executeUpdate(); 952 psch_d.executeUpdate(); 953 954 sdc.executeUpdate("DELETE FROM APP.FOO where A < -99"); 956 shc.executeUpdate("DELETE FROM APP.FOO where A < -99"); 957 scc.executeUpdate("DELETE FROM APP.FOO where A < -99"); 958 959 openRS.add(sdc.executeQuery("SELECT * FROM APP.FOO")); 962 openRS.add(shc.executeQuery("SELECT * FROM APP.FOO")); 963 openRS.add(scc.executeQuery("SELECT * FROM APP.FOO")); 964 965 openRS.add(psdc.executeQuery()); 967 openRS.add(pshc.executeQuery()); 968 openRS.add(pscc.executeQuery()); 969 970 psdc_d.executeUpdate(); 972 pshc_d.executeUpdate(); 973 pscc_d.executeUpdate(); 974 975 int orsCount = 0; 981 for (Iterator i = openRS.iterator(); i.hasNext();) { 982 ResultSet ors = (ResultSet ) i.next(); 983 ors.clearWarnings(); 984 orsCount++; 985 } 986 System.out.println("Global transaction open ResultSets " + orsCount); 987 988 989 try { 991 conn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT); 992 System.out.println("FAIL - set holdability in global xact."); 993 } catch (SQLException sqle) 994 { 995 TestUtil.dumpSQLExceptions(sqle, true); 996 } 997 998 Statement sglobalhold = conn.createStatement( 1002 ResultSet.TYPE_FORWARD_ONLY, 1003 ResultSet.CONCUR_READ_ONLY, 1004 ResultSet.HOLD_CURSORS_OVER_COMMIT); 1005 showHoldStatus("Global createStatement(hold)", sglobalhold); 1006 sglobalhold.close(); 1007 1008 PreparedStatement psglobalhold = conn.prepareStatement( 1009 "SELECT * FROM APP.FOO", 1010 ResultSet.TYPE_FORWARD_ONLY, 1011 ResultSet.CONCUR_READ_ONLY, 1012 ResultSet.HOLD_CURSORS_OVER_COMMIT); 1013 showHoldStatus("Global prepareStatement(hold)", psglobalhold); 1014 psglobalhold.close(); 1015 1016 if (!TestUtil.isDerbyNetClientFramework()) { showHoldStatus("Global xact Statement sdh ", sdh); 1020 showHoldStatus("Global xact Statement shh ", shh); 1021 showHoldStatus("Global xact Statement sch ", sch); 1022 1023 showHoldStatus("Global xact Statement psdh ", psdh); 1024 showHoldStatus("Global xact Statement pshh ", pshh); 1025 showHoldStatus("Global xact Statement psch ", psch); 1026 1027 showHoldStatus("Global xact Statement sdc ", sdc); 1028 showHoldStatus("Global xact Statement shc ", shc); 1029 showHoldStatus("Global xact Statement scc ", scc); 1030 1031 showHoldStatus("Global xact Statement psdh_d ", psdh_d); 1032 showHoldStatus("Global xact Statement pshh_d ", pshh_d); 1033 showHoldStatus("Global xact Statement psch_d ", psch_d); 1034 } 1035 1036 1037 xar.end(xid, XAResource.TMSUCCESS); 1038 if (xar.prepare(xid) != XAResource.XA_RDONLY) 1039 System.out.println("FAIL prepare didn't indicate r/o"); 1040 1041 int crsCount = 0; 1045 for (Iterator i = openRS.iterator(); i.hasNext();) { 1046 ResultSet crs = (ResultSet ) i.next(); 1047 try { 1048 crs.clearWarnings(); 1049 } catch (SQLException sqle) { 1050 } 1051 crsCount++; 1052 } 1053 System.out.println("After global transaction closed ResultSets " + crsCount); 1054 1055 1056 showHoldStatus("Global xact Statement sdh ", sdh); 1058 showHoldStatus("Global xact Statement shh ", shh); 1059 showHoldStatus("Global xact Statement sch ", sch); 1060 1061 showHoldStatus("Global xact Statement psdh ", psdh); 1062 showHoldStatus("Global xact Statement pshh ", pshh); 1063 showHoldStatus("Global xact Statement psch ", psch); 1064 1065 showHoldStatus("Global xact Statement sdc ", sdc); 1066 showHoldStatus("Global xact Statement shc ", shc); 1067 showHoldStatus("Global xact Statement scc ", scc); 1068 1069 showHoldStatus("Global xact Statement psdh_d ", psdh_d); 1070 showHoldStatus("Global xact Statement pshh_d ", pshh_d); 1071 showHoldStatus("Global xact Statement psch_d ", psch_d); 1072 1073 conn.close(); 1074 1075 System.out.println("derby966 complete"); 1076 1077 } catch (SQLException e) { 1078 TestUtil.dumpSQLExceptions(e); 1079 e.printStackTrace(System.out); 1080 } catch (XAException e) { 1081 XATestUtil.dumpXAException("derby966", e); 1082 } 1083 } 1084 1085 1090 private static void checkHeldRS(Connection conn, 1091 Statement s, ResultSet rs) throws SQLException 1092 { 1093 if (s.getConnection() != conn) 1094 System.out.println("FAIL - mismatched statement & Connection"); 1095 if (rs.getStatement() != s) 1096 { 1097 System.out.println("FAIL - mismatched statement & ResultSet"); 1099 System.out.println("Statement class " + s.getClass()); 1100 System.out.println("ResultSet' Statements class " + rs.getStatement().getClass()); 1101 } 1102 1103 boolean held = s.getResultSetHoldability() == 1104 ResultSet.HOLD_CURSORS_OVER_COMMIT; 1105 1106 System.out.println("ResultSet " + holdStatus(s.getResultSetHoldability())); 1107 1108 rs.next(); 1109 System.out.println(" BC A=" + rs.getInt(1)); 1110 conn.commit(); 1111 1112 try { 1113 while (rs.next()) 1114 { 1115 rs.getInt(1); 1116 System.out.println(" AC A=" + rs.getInt(1)); 1117 } 1118 if (!held) 1119 System.out.println("FAIL: non-held cursor not closed by commit"); 1120 } catch (SQLException sqle) 1121 { 1122 boolean ok = !held; 1123 boolean showError = true; 1124 if (ok) { 1125 if (TestUtil.isEmbeddedFramework()) { 1126 if ("XCL16".equals(sqle.getSQLState())) 1127 showError = false; 1128 } else if (TestUtil.isDerbyNetClientFramework()) { 1129 showError = false; 1131 } 1132 } 1133 if (showError) 1134 TestUtil.dumpSQLExceptions(sqle, ok); 1135 else if (ok) 1136 System.out.println("Non-held ResultSet correctly closed after commit"); 1137 } 1138 1139 rs.close(); 1140 conn.commit(); 1141 } 1142 1143 1146 private static void showHoldStatus(String tag, Statement s) throws SQLException 1147 { 1148 System.out.println(tag + "Statement holdable " + 1149 holdStatus(s.getResultSetHoldability())); 1150 SQLWarning w = s.getConnection().getWarnings(); 1151 while (w != null) 1152 { 1153 System.out.println(w.getSQLState() + " :" + w.toString()); 1154 w = w.getNextWarning(); 1155 } 1156 s.getConnection().clearWarnings(); 1157 1158 } 1159 1162 private static void showHoldStatus(String tag, Connection conn) throws SQLException 1163 { 1164 System.out.println(tag + "Connection holdable " + 1165 holdStatus(conn.getHoldability())); 1166 } 1167 1168 private static String holdStatus(int holdability) 1169 { 1170 String s; 1171 switch (holdability) 1172 { 1173 case ResultSet.CLOSE_CURSORS_AT_COMMIT: 1174 s = "CLOSE_CURSORS_AT_COMMIT "; 1175 break; 1176 case ResultSet.HOLD_CURSORS_OVER_COMMIT: 1177 s = "HOLD_CURSORS_OVER_COMMIT "; 1178 break; 1179 default: 1180 s = "UNKNOWN HOLDABILITY "; 1181 break; 1182 } 1183 1184 return s + Integer.toString(holdability); 1185 } 1186 1187 1252 private static void interleavingTransactions5(XADataSource xads) throws SQLException 1253 { 1254 System.out.println("interleavingTransactions5"); 1255 1256 XAConnection xac = xads.getXAConnection("mamta", "mamtapwd"); 1257 1258 } 1259 1260 private static void cleanUp(Connection conn) throws SQLException 1261 { 1262 String testObjects[] = { "view XATESTUTIL.global_xactTable", 1263 "schema XATESTUTIL restrict", "table app.foo", "table foo" }; 1264 Statement stmt = conn.createStatement(); 1265 TestUtil.cleanUpTest(stmt, testObjects); 1266 conn.commit(); 1267 stmt.close(); 1268 } 1269 1270} 1271 | Popular Tags |