**************************************************************** * * COMMENT SECTION * * DATE 1989/10/07 EMBEDDED COBOL LANGUAGE * NIST SQL VALIDATION TEST SUITE V6.0 * DISCLAIMER: * This program was written by employees of NIST to test SQL * implementations for conformance to the SQL standards. * NIST assumes no responsibility for any party's use of * this program. * * MPB004.PCO * WRITTEN BY: SUN DAJUN * * THIS PROGRAM IS PART B OF A TWO-PART PROGRAM(A & B) THAT * TESTS THE CONCURRENCY OF SQL * * REFERENCES * AMERICAN NATIONAL STANDARD database language - SQL * X3.135-1989 * * SECTION 4.16 Transactions * Paragraph Two ****************************************************************
MOVE"SULLIVAN1"TO uid CALL"AUTHID"USING uid MOVE"not logged in, not"TO uidx EXECSQLSELECT USER INTO :uidx FROM HU.ECCO END-EXEC MOVE SQLCODE TO SQL-COD if (uid NOT = uidx) then DISPLAY"ERROR: User ", uid " expected. User ", uidx "
- " connected" STOPRUN END-IF MOVE 0 TO errcnt DISPLAY "SQL Test Suite, V6.0, Embedded COBOL, mpb004.pco" DISPLAY "59-byte ID" DISPLAY"TEd Version #"
*date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME
*concurrency tuning variables follow: MOVE 13 TO retrys MOVE 50 TO tranct
EXECSQL COMMIT WORK END-EXEC MOVE SQLCODE TO SQL-COD
******************** BEGIN TEST0268 *******************
DISPLAY"*** This program is part B of a two-part
- " " DISPLAY"*** program (A & B) that tests deadlock management
- " " DISPLAY"*** in SQL. An implementation which rolls back " DISPLAY"*** without a negative SQLCODE will fail"
DISPLAY" This is Program B which starts after Program A...
- " "
* -----Synchronization-----
.
P105. MOVE 0 TO knum EXECSQLSELECTCOUNT(*) INTO :knum FROM MP4_NEXTKEY WHERE AUTHOR = 'A'END-EXEC MOVE SQLCODE TO SQL-COD
EXECSQL COMMIT WORK END-EXEC MOVE SQLCODE TO SQL-COD
*are we in sync?
if (knum = 0) then DISPLAY" PLEASE start program MPA004!!! " GOTO P105 END-IF
.
P106. MOVE 0 TO code1 EXECSQLINSERTINTO MP4_NEXTKEY (KEYNUM,AUTHOR)
VALUES(2, 'B') END-EXEC MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF EXECSQL COMMIT WORK END-EXEC MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF if (code1 NOT = 0) then EXECSQL ROLLBACK WORK END-EXEC MOVE SQLCODE TO SQL-COD DISPLAY"Retrying synchronization logic." GOTO P106 END-IF
*YES, we are in sync!
DISPLAY"Transaction B Starts!! " DISPLAY" " DISPLAY"IF this test lasts too long, DEADLOCK " DISPLAY"has taken place, STOP this test!" MOVE 0 TO times1
* -----Concurrent Transaction Loops-----
.
P110. MOVE 0 TO code1 if (times1 > retrys) then DISPLAY"**** TEST 0268 aborted***" DISPLAY"MPA004 will give a false *** fail ***" DISPLAY"Remove the test results from TESTREPORT" DISPLAY" and RERUN, after debugging." GOTO P193 END-IF EXECSQLSELECT NUMTEST INTO :who2 FROM MP4_MM2 END-EXEC MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF
*MP4_MM2 UPDATE loop MOVE 0 TO cnt
.
P111. EXECSQL UPDATE MP4_MM2 SET NUMTEST = NUMTEST - 3 END-EXEC MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF COMPUTE cnt = cnt + 1 if (cnt < tranct AND code1 = 0) then GOTO P111 END-IF
EXECSQLSELECT NUMTEST INTO :who1 FROM MP4_NN END-EXEC MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF
*MP4_NN UPDATE loop MOVE 0 TO cnt
.
P112. EXECSQL UPDATE MP4_NN SET NUMTEST = NUMTEST - 5 END-EXEC MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF COMPUTE cnt = cnt + 1 if (cnt < 4 AND code1 = 0) then GOTO P112 END-IF
* -----Evaluation-----
EXECSQLSELECT NUMTEST INTO :rslt1 FROM MP4_NN END-EXEC MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF EXECSQLSELECT NUMTEST INTO :rslt2 FROM MP4_MM2 END-EXEC MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF
if (code1 = 0) then EXECSQL COMMIT WORK END-EXEC MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF END-IF if (code1 NOT = 0) then DISPLAY" " DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK?
- " !+!+!+!+!+!+!+!+!+!+!" DISPLAY"Negative SQLCODE (Deadlock?) was returned
- " earlier" DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK?
- " !+!+!+!+!+!+!+!+!+!+!" COMPUTE times1 = times1 + 1 EXECSQL ROLLBACK WORK END-EXEC MOVE SQLCODE TO SQL-COD GOTO P110 END-IF
*end transaction DISPLAY"MPB004 transaction completed !! at time: " *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME
*Compute difference from original value COMPUTE rslt1 = who1 - rslt1 COMPUTE rslt2 = who2 - rslt2 COMPUTE tranct = tranct * 3
DISPLAY" The correct answer is :" DISPLAY" rslt1 is 20" DISPLAY" rslt2 is ", tranct DISPLAY" Your answer is :" DISPLAY" rslt1 is ", rslt1 DISPLAY" rslt2 is ", rslt2
if ( rslt1 = 20 AND rslt2 = tranct) then DISPLAY"mpb004.pco: *** pass *** " EXECSQLINSERTINTO HU.TESTREPORT
VALUES('0268','pass','PCO') END-EXEC MOVE SQLCODE TO SQL-COD else DISPLAY"mpb004.pco: *** fail *** " EXECSQLINSERTINTO HU.TESTREPORT
VALUES('0268','fail','PCO') END-EXEC MOVE SQLCODE TO SQL-COD COMPUTE errcnt = errcnt + 1 END-IF
EXECSQL COMMIT WORK END-EXEC MOVE SQLCODE TO SQL-COD
if (times1 = 0) then DISPLAY"Look for DEADLOCK message from MPA004." DISPLAY"If MPA004 does not issues a DEADLOCK message," DISPLAY" you will need to RERUN this test, after" DISPLAY" (using TEd) increasing value of variable
- " tranct." END-IF
******************** END TEST0268 *******************
**** TESTER MAY CHOOSE TO INSERT CODE FOR errcnt > 0
STOPRUN.
* **** Procedures for PERFORM statements
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.