[ 
https://issues.apache.org/jira/browse/DERBY-7042?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16811686#comment-16811686
 ] 

Rick Hillegas commented on DERBY-7042:
--------------------------------------

Thanks for those suggestions, Bryan. Attaching a new version of Derby7042.java. 
This version adds another procedure which leaves more fingerprints in 
derby.log. I also updated the script with the following changes:

* Moved the property-setting out of the script and onto the VM boot command, 
just in case I'm misunderstanding when the properties take effect.

* Printed timestamps before and after the UPDATE statement.

* Increased the lock timeout to twice the length of the deadlock timeout.

* Performed two UPDATEs back-to-back.

I ran with the following trace properties:

{noformat}
  -Dderby.storage.rowLocking=false \
  -Dderby.locks.deadlockTimeout=5 \
  -Dderby.locks.waitTimeout=10 \
  -Dderby.locks.deadlockTrace=true \
  -Dderby.locks.monitor=true \
  -Dderby.language.logStatementText=true \
  -Dderby.stream.error.logSeverityLevel=0 \
{noformat}

The revised experiment discloses the following behavior:

* The INSERT takes 10 seconds to run, the length of the lock timeout. Looking 
inside derby.log, the 10 seconds elapse between the compilation and execution 
of the insert trigger. The trigger compilation and execution occur AFTER the 
execution of the INSERT statement.

* The first UPDATE takes 10 seconds to run, the length of the lock timeout. As 
with the INSERT statement, the 10 seconds elapse between the compilation and 
execution of the update trigger. The trigger compilation and execution occur 
AFTER the execution of the UPDATE statement.

* The second UPDATE executes immediately. There is no pause between the 
compilation and execution of the update trigger.

* There are no timeout or deadlock diagnostics in derby.log. However, there are 
transaction ids on the statements. It appears that the triggers are being 
compiled in the same transaction as their triggering statements.

Maybe, somehow, the table-level lock forced by derby.storage.rowLocking=false 
is interfering with the compilation of the triggers. The second execution goes 
fast because the triggers are already compiled and sitting in the statement 
cache.

Here is the revised script:

{noformat}
connect 'jdbc:derby:memory:db1;create=true';

-- create schema
CREATE TABLE ZooAnimals
(
    Name VARCHAR(255),
    Amount INT,
    Feed BOOLEAN,
    Zoo VARCHAR(255)
)
;

CREATE PROCEDURE helloDML(dml varchar(100))
  LANGUAGE JAVA
  EXTERNAL NAME 'Derby7042.helloDML'
  PARAMETER STYLE JAVA
  NO SQL
;

CREATE TRIGGER ZooUpdateTrigger
  AFTER UPDATE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('UPDATE')
;

CREATE TRIGGER ZooInsertTrigger
  AFTER INSERT ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('INSERT')
;

CREATE TRIGGER ZooDeleteTrigger
  AFTER DELETE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('DELETE')
;

-- populate table. this takes 10 seconds, the length of the lock timeout.
VALUES CURRENT_TIMESTAMP;
INSERT INTO ZooAnimals (Name, Amount, Feed, Zoo) VALUES ('Gorilla', 1, true, 
'Cincinnati');
VALUES CURRENT_TIMESTAMP;
SELECT * FROM ZooAnimals;

-- reboot to flush the statement cache.
connect 'jdbc:derby:memory:db1;shutdown=true';
connect 'jdbc:derby:memory:db1';

-- update table. the UPDATE takes 10 seconds, the length of the lock timeout.
VALUES CURRENT_TIMESTAMP;
UPDATE ZooAnimals SET Name = 'Aardvark' WHERE Zoo = 'Cincinnati';
VALUES CURRENT_TIMESTAMP;
SELECT * FROM ZooAnimals;

-- try it again. the UPDATE runs immediately.
VALUES CURRENT_TIMESTAMP;
UPDATE ZooAnimals SET Name = 'Alligator' WHERE Zoo = 'Cincinnati';
VALUES CURRENT_TIMESTAMP;
SELECT * FROM ZooAnimals;
{noformat}

Here is its output:

{noformat}
ij version 10.16
ij> connect 'jdbc:derby:memory:db1;create=true';
ij> -- create schema
CREATE TABLE ZooAnimals
(
    Name VARCHAR(255),
    Amount INT,
    Feed BOOLEAN,
    Zoo VARCHAR(255)
)
;
0 rows inserted/updated/deleted
ij> CREATE PROCEDURE helloDML(dml varchar(100))
  LANGUAGE JAVA
  EXTERNAL NAME 'Derby7042.helloDML'
  PARAMETER STYLE JAVA
  NO SQL
;
0 rows inserted/updated/deleted
ij> CREATE TRIGGER ZooUpdateTrigger
  AFTER UPDATE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('UPDATE')
;
0 rows inserted/updated/deleted
ij> CREATE TRIGGER ZooInsertTrigger
  AFTER INSERT ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('INSERT')
;
0 rows inserted/updated/deleted
ij> CREATE TRIGGER ZooDeleteTrigger
  AFTER DELETE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('DELETE')
;
0 rows inserted/updated/deleted
ij> -- populate table. this takes 10 seconds, the length of the lock timeout.
VALUES CURRENT_TIMESTAMP;
1                            
-----------------------------
2019-04-06 12:57:55.049      

1 row selected
ij> INSERT INTO ZooAnimals (Name, Amount, Feed, Zoo) VALUES ('Gorilla', 1, 
true, 'Cincinnati');
Hello INSERT
1 row inserted/updated/deleted
ij> VALUES CURRENT_TIMESTAMP;
1                            
-----------------------------
2019-04-06 12:58:05.173      

1 row selected
ij> SELECT * FROM ZooAnimals;
NAME                                                                            
                                                |AMOUNT     |FEED |ZOO          
                                                                                
                                   
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Gorilla                                                                         
                                                |1          |true |Cincinnati   
                                                                                
                                   

1 row selected
ij> -- reboot to flush the statement cache.
connect 'jdbc:derby:memory:db1;shutdown=true';
ERROR 08006: Database 'memory:db1' shutdown.
ij> connect 'jdbc:derby:memory:db1';
ij(CONNECTION1)> -- update table. the UPDATE takes 10 seconds, the length of 
the lock timeout.
VALUES CURRENT_TIMESTAMP;
1                            
-----------------------------
2019-04-06 12:58:05.286      

1 row selected
ij(CONNECTION1)> UPDATE ZooAnimals SET Name = 'Aardvark' WHERE Zoo = 
'Cincinnati';
Hello UPDATE
1 row inserted/updated/deleted
ij(CONNECTION1)> VALUES CURRENT_TIMESTAMP;
1                            
-----------------------------
2019-04-06 12:58:15.379      

1 row selected
ij(CONNECTION1)> SELECT * FROM ZooAnimals;
NAME                                                                            
                                                |AMOUNT     |FEED |ZOO          
                                                                                
                                   
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Aardvark                                                                        
                                                |1          |true |Cincinnati   
                                                                                
                                   

1 row selected
ij(CONNECTION1)> -- try it again. the UPDATE runs immediately.
VALUES CURRENT_TIMESTAMP;
1                            
-----------------------------
2019-04-06 12:58:15.389      

1 row selected
ij(CONNECTION1)> UPDATE ZooAnimals SET Name = 'Alligator' WHERE Zoo = 
'Cincinnati';
Hello UPDATE
1 row inserted/updated/deleted
ij(CONNECTION1)> VALUES CURRENT_TIMESTAMP;
1                            
-----------------------------
2019-04-06 12:58:15.4        

1 row selected
ij(CONNECTION1)> SELECT * FROM ZooAnimals;
NAME                                                                            
                                                |AMOUNT     |FEED |ZOO          
                                                                                
                                   
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Alligator                                                                       
                                                |1          |true |Cincinnati   
                                                                                
                                   

1 row selected
{noformat}

Here are the contents of derby.log:

{noformat}
----------------------------------------------------------------
Sat Apr 06 12:57:54 PDT 2019:
Booting Derby version The Apache Software Foundation - Apache Derby - 10.16.0.0 
alpha - (1856150:1856701M): instance a816c00e-0169-f43a-9524-000007258cc8 
on database directory memory:/Users/rhillegas/derby/mainline/db1 with class 
loader jdk.internal.loader.ClassLoaders$AppClassLoader@484b61fc 
Loaded from file:/Users/rhillegas/derby/mainline/trunk/jars/sane/derby.jar
java.vendor=Oracle Corporation
java.runtime.version=9+181
user.dir=/Users/rhillegas/derby/mainline
os.name=Mac OS X
os.arch=x86_64
os.version=10.14.2
derby.system.home=null
Database Class Loader started - derby.database.classpath=''
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 165), (SESSIONID = 0), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 165), (SESSIONID = 0), 
(DATABASE = memory:db1), (DRDAID = null), Rolling back
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 166), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 167), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
-- create schema
CREATE TABLE ZooAnimals
(
    Name VARCHAR(255),
    Amount INT,
    Feed BOOLEAN,
    Zoo VARCHAR(255)
)
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 167), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: -- 
create schema
CREATE TABLE ZooAnimals
(
    Name VARCHAR(255),
    Amount INT,
    Feed BOOLEAN,
    Zoo VARCHAR(255)
)
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 167), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: -- 
create schema
CREATE TABLE ZooAnimals
(
    Name VARCHAR(255),
    Amount INT,
    Feed BOOLEAN,
    Zoo VARCHAR(255)
)
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 167), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 170), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
CREATE PROCEDURE helloDML(dml varchar(100))
  LANGUAGE JAVA
  EXTERNAL NAME 'Derby7042.helloDML'
  PARAMETER STYLE JAVA
  NO SQL
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 170), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
CREATE PROCEDURE helloDML(dml varchar(100))
  LANGUAGE JAVA
  EXTERNAL NAME 'Derby7042.helloDML'
  PARAMETER STYLE JAVA
  NO SQL
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 170), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: CREATE 
PROCEDURE helloDML(dml varchar(100))
  LANGUAGE JAVA
  EXTERNAL NAME 'Derby7042.helloDML'
  PARAMETER STYLE JAVA
  NO SQL
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 170), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 173), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
CREATE TRIGGER ZooUpdateTrigger
  AFTER UPDATE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('UPDATE')
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 173), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
CREATE TRIGGER ZooUpdateTrigger
  AFTER UPDATE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('UPDATE')
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 173), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: CREATE 
TRIGGER ZooUpdateTrigger
  AFTER UPDATE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('UPDATE')
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 173), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
CALL "APP"."HELLODML"('UPDATE') :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 173), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
CALL "APP"."HELLODML"('UPDATE') :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 173), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 177), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
CREATE TRIGGER ZooInsertTrigger
  AFTER INSERT ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('INSERT')
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 177), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
CREATE TRIGGER ZooInsertTrigger
  AFTER INSERT ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('INSERT')
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 177), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: CREATE 
TRIGGER ZooInsertTrigger
  AFTER INSERT ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('INSERT')
 :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 177), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
CALL "APP"."HELLODML"('INSERT') :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 177), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
CALL "APP"."HELLODML"('INSERT') :End prepared statement
Sat Apr 06 12:57:54 PDT 2019 Thread[main,5,main] (XID = 177), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 182), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
CREATE TRIGGER ZooDeleteTrigger
  AFTER DELETE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('DELETE')
 :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 182), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
CREATE TRIGGER ZooDeleteTrigger
  AFTER DELETE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('DELETE')
 :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 182), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: CREATE 
TRIGGER ZooDeleteTrigger
  AFTER DELETE ON ZOOANIMALS FOR EACH STATEMENT MODE DB2SQL
    CALL helloDML('DELETE')
 :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 182), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
CALL "APP"."HELLODML"('DELETE') :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 182), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
CALL "APP"."HELLODML"('DELETE') :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 182), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
-- populate table. this takes 10 seconds, the length of the lock timeout.
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: -- 
populate table. this takes 10 seconds, the length of the lock timeout.
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: -- 
populate table. this takes 10 seconds, the length of the lock timeout.
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
INSERT INTO ZooAnimals (Name, Amount, Feed, Zoo) VALUES ('Gorilla', 1, true, 
'Cincinnati') :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
INSERT INTO ZooAnimals (Name, Amount, Feed, Zoo) VALUES ('Gorilla', 1, true, 
'Cincinnati') :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: INSERT 
INTO ZooAnimals (Name, Amount, Feed, Zoo) VALUES ('Gorilla', 1, true, 
'Cincinnati') :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
CALL "APP"."HELLODML"('INSERT') :End prepared statement
Sat Apr 06 12:57:55 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
CALL "APP"."HELLODML"('INSERT') :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: CALL 
"APP"."HELLODML"('INSERT') :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 187), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: VALUES 
CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
SELECT * FROM ZooAnimals :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
SELECT * FROM ZooAnimals :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: SELECT 
* FROM ZooAnimals :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 193), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 196), (SESSIONID = 2), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 196), (SESSIONID = 2), 
(DATABASE = memory:db1), (DRDAID = null), Rolling back
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 197), (SESSIONID = 3), 
(DATABASE = memory:db1), (DRDAID = null), Committing
----------------------------------------------------------------
Sat Apr 06 12:58:05 PDT 2019:
Shutting down instance a816c00e-0169-f43a-9524-000007258cc8 on database 
directory memory:/Users/rhillegas/derby/mainline/db1 with class loader 
jdk.internal.loader.ClassLoaders$AppClassLoader@484b61fc 
----------------------------------------------------------------
Sat Apr 06 12:58:05 PDT 2019:
Booting Derby version The Apache Software Foundation - Apache Derby - 10.16.0.0 
alpha - (1856150:1856701M): instance 0a594127-0169-f43a-9524-000007258cc8 
on database directory memory:/Users/rhillegas/derby/mainline/db1 with class 
loader jdk.internal.loader.ClassLoaders$AppClassLoader@484b61fc 
Loaded from file:/Users/rhillegas/derby/mainline/trunk/jars/sane/derby.jar
java.vendor=Oracle Corporation
java.runtime.version=9+181
user.dir=/Users/rhillegas/derby/mainline
os.name=Mac OS X
os.arch=x86_64
os.version=10.14.2
derby.system.home=null
Database Class Loader started - derby.database.classpath=''
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 203), (SESSIONID = 0), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 203), (SESSIONID = 0), 
(DATABASE = memory:db1), (DRDAID = null), Rolling back
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 204), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
-- update table. the UPDATE takes 10 seconds, the length of the lock timeout.
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: -- 
update table. the UPDATE takes 10 seconds, the length of the lock timeout.
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: -- 
update table. the UPDATE takes 10 seconds, the length of the lock timeout.
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
UPDATE ZooAnimals SET Name = 'Aardvark' WHERE Zoo = 'Cincinnati' :End prepared 
statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
UPDATE ZooAnimals SET Name = 'Aardvark' WHERE Zoo = 'Cincinnati' :End prepared 
statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: UPDATE 
ZooAnimals SET Name = 'Aardvark' WHERE Zoo = 'Cincinnati' :End prepared 
statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
CALL "APP"."HELLODML"('UPDATE') :End prepared statement
Sat Apr 06 12:58:05 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
CALL "APP"."HELLODML"('UPDATE') :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: CALL 
"APP"."HELLODML"('UPDATE') :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 205), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: VALUES 
CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
SELECT * FROM ZooAnimals :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
SELECT * FROM ZooAnimals :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: SELECT 
* FROM ZooAnimals :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 211), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
-- try it again. the UPDATE runs immediately.
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: -- 
try it again. the UPDATE runs immediately.
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: -- try 
it again. the UPDATE runs immediately.
VALUES CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Begin compiling prepared statement: 
UPDATE ZooAnimals SET Name = 'Alligator' WHERE Zoo = 'Cincinnati' :End prepared 
statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), End compiling prepared statement: 
UPDATE ZooAnimals SET Name = 'Alligator' WHERE Zoo = 'Cincinnati' :End prepared 
statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: UPDATE 
ZooAnimals SET Name = 'Alligator' WHERE Zoo = 'Cincinnati' :End prepared 
statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: CALL 
"APP"."HELLODML"('UPDATE') :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 214), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 218), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: VALUES 
CURRENT_TIMESTAMP :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 218), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 218), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 218), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Executing prepared statement: SELECT 
* FROM ZooAnimals :End prepared statement
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 218), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 218), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Committing
Sat Apr 06 12:58:15 PDT 2019 Thread[main,5,main] (XID = 218), (SESSIONID = 1), 
(DATABASE = memory:db1), (DRDAID = null), Rolling back
----------------------------------------------------------------
Sat Apr 06 12:58:15 PDT 2019: Shutting down Derby engine
----------------------------------------------------------------
Sat Apr 06 12:58:15 PDT 2019:
Shutting down instance 0a594127-0169-f43a-9524-000007258cc8 on database 
directory memory:/Users/rhillegas/derby/mainline/db1 with class loader 
jdk.internal.loader.ClassLoaders$AppClassLoader@484b61fc 
----------------------------------------------------------------
{noformat}


> Multiple triggers with rowLocking = false causes deadlock
> ---------------------------------------------------------
>
>                 Key: DERBY-7042
>                 URL: https://issues.apache.org/jira/browse/DERBY-7042
>             Project: Derby
>          Issue Type: Bug
>          Components: Documentation, JDBC
>    Affects Versions: 10.8.2.2, 10.8.3.0, 10.9.1.0, 10.10.1.1, 10.10.2.0, 
> 10.11.1.1, 10.12.1.1, 10.13.1.1, 10.14.1.0, 10.14.2.0, 10.15.1.3
>         Environment: ------------------ Java Information ------------------
> Java Version:    1.8.0_201
> Java Vendor:     Oracle Corporation
> OS name:         Linux
> OS architecture: i386
> OS version:      4.15.0-46-generic
> java.specification.name: Java Platform API Specification
> java.specification.version: 1.8
> java.runtime.version: 1.8.0_201-b09
> --------- Derby Information --------
> [.../TriggerRepro/derby/derby-10.14.1.0.jar] 10.14.1.0 - (1808820)
>            Reporter: Michael Schuetze
>            Priority: Minor
>              Labels: documentation, performance
>         Attachments: Derby7042.java, Derby7042.java
>
>
> Repro for the bug can be found here: 
> [https://github.com/mjschuetze102/TriggerRepro]
> Includes a detailed README of steps that show effect of bug as well as two 
> versions of the Derby database. 10.8.1.2, the last version where the bug was 
> not present and version 10.14.1.0, for easy access.
> This may just be an issue of not having enough documentation on database 
> Triggers (see Conclusions Based on Results)
> h2. Summary of Issue
> *Having multiple triggers with {{'derby.storage.rowLocking', 'false'}} causes 
> issues with deadlocking*
>  # Executing Update trigger causes deadlock when there is an Insert or Delete 
> trigger
>  # Executing Insert trigger causes deadlock when there is a Delete trigger
>  # Executing Delete trigger does not cause deadlock
> *{{'derby.locks.deadlockTimeout'}} does not seem to work in above case*
>  # While executing issue above, none of the triggers were terminated and 
> waitTimeout time was hit
> h2. Conclusions Based on Results
> *Having multiple triggers with {{'derby.storage.rowLocking', 'false'}} causes 
> issues with deadlocking*
> Triggers seem to get into deadlock scenarios with any trigger defined after 
> itself. If this is the case, it should be documented somewhere that 
> rowLocking needs to be enabled to use the trigger feature if multiple 
> triggers would be used on the same database table.
> *{{'derby.locks.deadlockTimeout'}} does not seem to work in above case*
> Based on documentation, I could not find any concrete evidence of whether 
> this is intended functionality.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to