📄 rowlockiso.out
字号:
ij> -- Very basic single user testing of row locking, verify that the right locks-- are obtained for simple operations. This test only looks at table and-- row logical locks, it does not verify physical latches or lock ordering.-- The basic methodology is:-- start transaction-- simple operation-- print lock table which should match the master-- end transation-- run resource 'createTestProcedures.subsql';ij> CREATE FUNCTION PADSTRING (DATA VARCHAR(32000), LENGTH INTEGER) RETURNS VARCHAR(32000) EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.Formatters.padString' LANGUAGE JAVA PARAMETER STYLE JAVA;0 rows inserted/updated/deletedij> CREATE PROCEDURE WAIT_FOR_POST_COMMIT() DYNAMIC RESULT SETS 0 LANGUAGE JAVA EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.T_Access.waitForPostCommitToFinish' PARAMETER STYLE JAVA;0 rows inserted/updated/deletedij> run resource 'LockTableQuery.subsql';ij> create view lock_table asselect cast(username as char(8)) as username, cast(t.type as char(8)) as trantype, cast(l.type as char(8)) as type, cast(lockcount as char(3)) as cnt, mode, cast(tablename as char(12)) as tabname, cast(lockname as char(10)) as lockname, state, statusfrom new org.apache.derby.diag.LockTable() l right outer join new org.apache.derby.diag.TransactionTable() ton l.xid = t.xid where l.tableType <> 'S' and t.type='UserTransaction';0 rows inserted/updated/deletedij> --on l.xid = t.xid where l.tableType <> 'S' or l.tableType is null-- order by-- tabname, type desc, mode, cnt, lockname-- lock table with system catalog locks included.create view full_lock_table asselect cast(username as char(8)) as username, cast(t.type as char(8)) as trantype, cast(l.type as char(8)) as type, cast(lockcount as char(3)) as cnt, mode, cast(tablename as char(12)) as tabname, cast(lockname as char(10)) as lockname, state, statusfrom new org.apache.derby.diag.LockTable() l right outer join new org.apache.derby.diag.TransactionTable() ton l.xid = t.xid where l.tableType <> 'S' ;0 rows inserted/updated/deletedij> -- lock table with no join.create view lock_table2 asselect cast(l.xid as char(8)) as xid, cast(l.type as char(8)) as type, cast(lockcount as char(3)) as cnt, mode, cast(tablename as char(12)) as tabname, cast(lockname as char(10)) as lockname, statefrom new org.apache.derby.diag.LockTable() l where l.tableType <> 'S' ;0 rows inserted/updated/deletedij> -- transaction table with no join.create view tran_table asselect *from new org.apache.derby.diag.TransactionTable() t ;0 rows inserted/updated/deletedij> autocommit off;ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize', '4096');0 rows inserted/updated/deletedij> create table a (a int, b int, c varchar(1900)) ;0 rows inserted/updated/deletedij> commit;ij> set isolation read committed;0 rows inserted/updated/deletedij> commit;ij> ---------------------------------------------------------------------------------- Test select from empty heap table--------------------------------------------------------------------------------select a, b from a;A |B -----------------------ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------ij> commit;ij> ---------------------------------------------------------------------------------- Test select from one row heap table--------------------------------------------------------------------------------insert into a values (1, -1, PADSTRING('one',1900));1 row inserted/updated/deletedij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------APP |UserTran|TABLE |1 |IX |A |Tablelock |GRANT|ACTIVE APP |UserTran|ROW |1 |X |A |(1,7) |GRANT|ACTIVE ij> commit;ij> select a, b from a;A |B -----------------------1 |-1 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------ij> commit;ij> ---------------------------------------------------------------------------------- Test select from two row heap table - this will release one row lock as it-- moves to the next one.--------------------------------------------------------------------------------insert into a values (2, -2, PADSTRING('two',1900));1 row inserted/updated/deletedij> commit;ij> select a,b from a;A |B -----------------------1 |-1 2 |-2 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------ij> commit;ij> ---------------------------------------------------------------------------------- Test select from three row heap table (multiple pages) - this will release -- one row lock as it moves to the next one.--------------------------------------------------------------------------------insert into a values (3, -3, PADSTRING('two',1900));1 row inserted/updated/deletedij> insert into a values (4, -4, PADSTRING('two',1900));1 row inserted/updated/deletedij> insert into a values (5, -5, PADSTRING('two',1900));1 row inserted/updated/deletedij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------APP |UserTran|TABLE |3 |IX |A |Tablelock |GRANT|ACTIVE APP |UserTran|ROW |1 |X |A |(2,6) |GRANT|ACTIVE APP |UserTran|ROW |1 |X |A |(2,7) |GRANT|ACTIVE APP |UserTran|ROW |1 |X |A |(3,6) |GRANT|ACTIVE ij> commit;ij> delete from a where a.a = 3;1 row inserted/updated/deletedij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------APP |UserTran|TABLE |2 |IX |A |Tablelock |GRANT|ACTIVE APP |UserTran|ROW |1 |X |A |(2,6) |GRANT|ACTIVE ij> commit;ij> select a,b from a;A |B -----------------------1 |-1 2 |-2 4 |-4 5 |-5 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------ij> commit;ij> ---------------------------------------------------------------------------------- Test full read cursor scan over all the rows in the heap, no group fetch.--------------------------------------------------------------------------------CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','1');0 rows inserted/updated/deletedij> -- RESOLVE: missing row locks-- WORKAROUND: creating an index and dropping it -- to force the query 'select a, b from a' to be recompiledcreate index ix1 on a(a);0 rows inserted/updated/deletedij> drop index ix1;0 rows inserted/updated/deletedij> commit;ij> get cursor scan_cursor as 'select a, b from a';ij> call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault', '16');0 rows inserted/updated/deletedij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------APP |UserTran|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE ij> next scan_cursor;A |B -----------------------1 |-1 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------APP |UserTran|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE APP |UserTran|ROW |1 |S |A |(1,7) |GRANT|ACTIVE ij> next scan_cursor;A |B -----------------------2 |-2 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------APP |UserTran|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE APP |UserTran|ROW |1 |S |A |(1,8) |GRANT|ACTIVE ij> next scan_cursor;A |B -----------------------4 |-4 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------APP |UserTran|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE APP |UserTran|ROW |1 |S |A |(2,7) |GRANT|ACTIVE ij> next scan_cursor;A |B -----------------------5 |-5 ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------APP |UserTran|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE APP |UserTran|ROW |1 |S |A |(3,6) |GRANT|ACTIVE ij> next scan_cursor;No current rowij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------APP |UserTran|TABLE |1 |IS |A |Tablelock |GRANT|ACTIVE ij> close scan_cursor;ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------ij> commit;ij> select * from lock_table order by tabname, type desc, mode, cnt, lockname;USERNAME|TRANTYPE|TYPE |CNT |MODE|TABNAME |LOCKNAME |STATE|STATUS ---------------------------------------------------------------------------ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','16');0 rows inserted/updated/deletedij> ---------------------------------------------------------------------------------- Test full cursor scan over all the rows in the heap, with 2 row group fetch.--------------------------------------------------------------------------------CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.language.bulkFetchDefault','2');0 rows inserted/updated/deletedij> -- RESOLVE: missing row locks-- WORKAROUND: creating an index and dropping it -- to force the query 'select a, b from a' to be recompiledcreate index ix1 on a(a);0 rows inserted/updated/deletedij> drop index ix1;0 rows inserted/updated/deletedij> commit;ij> get cursor scan_cursor as 'select a, b from a';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -