Details
Description
created after CONJ-948
Synchronous connectors can rely on OK_Packet/EOF_Packet server status's SERVER_STATUS_IN_TRANS flag that explicitly indicate if a transaction is currently active.
Java connector use that information to avoid issuing a rollback/commit command, skipping the command if there is no transaction.
Problem concerns only MyISAM that never set SERVER_STATUS_IN_TRANS flag. Still there is some case when there is some kind of lock : ( example from serg: )
create table t1 (a int) engine=myisam; |
|
insert t1 values (1); |
and in another
drop table t1; |
this DROP TABLE will wait until the transaction ends.
- either MyISAM should return SERVER_STATUS_IN_TRANS flag, so connector know there is really a commit to be issued.
- either MyISAM doesn't set any lock. (It may be just an issue : for some metadata locks are taken on the object name, before the table is opened, before we know it's a MyISAM table.)
Either way is ok.
(Another solution would be to always issue a COMMIT/ROLLBACK statement when there is no need, but that would degrade performance dramatically for some application. For example when connections are given back to pools, pools generally issues a connection.rollback() to ensure connection state, and there is lots of application where that command would represent 25% of the commands)
Attachments
Issue Links
- causes
-
CONJ-948 Under certain circumstances, Connector J does not send "commit"
-
- Closed
-
- relates to
-
MDEV-30889 Memory leak issues with MariaDB 10.6.12 and OOM Crashes
-
- Confirmed
-
Activity
Field | Original Value | New Value |
---|---|---|
Priority | Major [ 3 ] | Critical [ 2 ] |
Affects Version/s | 10.3 [ 22126 ] | |
Affects Version/s | 10.4 [ 22408 ] | |
Affects Version/s | 10.5 [ 23123 ] | |
Affects Version/s | 10.6 [ 24028 ] | |
Affects Version/s | 10.7 [ 24805 ] | |
Affects Version/s | 10.8 [ 26121 ] |
Fix Version/s | 10.3 [ 22126 ] | |
Fix Version/s | 10.4 [ 22408 ] | |
Fix Version/s | 10.5 [ 23123 ] | |
Fix Version/s | 10.6 [ 24028 ] | |
Fix Version/s | 10.7 [ 24805 ] | |
Fix Version/s | 10.8 [ 26121 ] |
Assignee | Oleksandr Byelkin [ sanja ] |
Description |
_created after Synchronous connectors can rely on OK_Packet/EOF_Packet server status's [SERVER_STATUS_IN_TRANS |https://mariadb.com/kb/en/ok_packet/#server-status-flag] flag that explicitly indicate if a transaction is currently active. Java connector use that information to avoid issuing a rollback/commit command, skipping the command if there is no transaction. Problem concerns only MyISAM that never set SERVER_STATUS_IN_TRANS flag. Still there is some case when there is some kind of lock : ( example from serg: ) {code:sql} create table t1 (a int) engine=myisam; start transaction; insert t1 values (1); {code} and in another {code:sql} drop table t1; {code} this {{DROP TABLE}} will wait until the transaction ends. * either MyISAM should return SERVER_STATUS_IN_TRANS flag, so connector know there is really a commit to be issued. * either MyISAM doesn't set any lock. (It may be just an issue : for some metadata locks are taken on the object *name*, before the table is opened, before we know it's a MyISAM table.) Either way is ok. (Another solution would be to always issue a COMMIT/ROLLBACK statement when there is no need, but that would degrade performance dramatically for some application. For example when connections are given back to pools, pools generally issues a connection.rollback() to ensure connection state, and there is lots of application where that command would represent 25% of the commands) |
_created after Synchronous connectors can rely on OK_Packet/EOF_Packet server status's [SERVER_STATUS_IN_TRANS |https://mariadb.com/kb/en/ok_packet/#server-status-flag] flag that explicitly indicate if a transaction is currently active. Java connector use that information to avoid issuing a rollback/commit command, skipping the command if there is no transaction. Problem concerns only MyISAM that never set SERVER_STATUS_IN_TRANS flag. Still there is some case when there is some kind of lock : ( example from serg: ) {code:sql} create table t1 (a int) engine=myisam; set autocommit=0; insert t1 values (1); {code} and in another {code:sql} drop table t1; {code} this {{DROP TABLE}} will wait until the transaction ends. * either MyISAM should return SERVER_STATUS_IN_TRANS flag, so connector know there is really a commit to be issued. * either MyISAM doesn't set any lock. (It may be just an issue : for some metadata locks are taken on the object *name*, before the table is opened, before we know it's a MyISAM table.) Either way is ok. (Another solution would be to always issue a COMMIT/ROLLBACK statement when there is no need, but that would degrade performance dramatically for some application. For example when connections are given back to pools, pools generally issues a connection.rollback() to ensure connection state, and there is lots of application where that command would represent 25% of the commands) |
Summary | MyISAM wrong server status flags. | MyISAM wrong server status flags |
Fix Version/s | 10.7 [ 24805 ] |
Status | Open [ 1 ] | In Progress [ 3 ] |
Fix Version/s | 10.3 [ 22126 ] |
Fix Version/s | 10.8 [ 26121 ] |
Link | This issue relates to MDEV-30889 [ MDEV-30889 ] |
Status | In Progress [ 3 ] | Stalled [ 10000 ] |
Status | Stalled [ 10000 ] | In Progress [ 3 ] |
Status | In Progress [ 3 ] | Stalled [ 10000 ] |
Assignee | Oleksandr Byelkin [ sanja ] | Sergei Golubchik [ serg ] |
Status | Stalled [ 10000 ] | In Progress [ 3 ] |
Status | In Progress [ 3 ] | Stalled [ 10000 ] |
Assignee | Sergei Golubchik [ serg ] | Oleksandr Byelkin [ sanja ] |
Status | Stalled [ 10000 ] | In Review [ 10002 ] |
Assignee | Oleksandr Byelkin [ sanja ] | Sergei Golubchik [ serg ] |
Status | In Review [ 10002 ] | Stalled [ 10000 ] |
Component/s | Protocol [ 14604 ] | |
Fix Version/s | 10.4.32 [ 29300 ] | |
Fix Version/s | 10.5.23 [ 29012 ] | |
Fix Version/s | 10.6.16 [ 29014 ] | |
Fix Version/s | 10.10.7 [ 29018 ] | |
Fix Version/s | 10.11.6 [ 29020 ] | |
Fix Version/s | 11.0.4 [ 29021 ] | |
Fix Version/s | 11.1.3 [ 29023 ] | |
Fix Version/s | 10.4 [ 22408 ] | |
Fix Version/s | 10.5 [ 23123 ] | |
Fix Version/s | 10.6 [ 24028 ] | |
Resolution | Fixed [ 1 ] | |
Status | Stalled [ 10000 ] | Closed [ 6 ] |
Component/s | Locking [ 10900 ] |
Component/s | Storage Engine - MyISAM [ 10600 ] |
Description |
_created after Synchronous connectors can rely on OK_Packet/EOF_Packet server status's [SERVER_STATUS_IN_TRANS |https://mariadb.com/kb/en/ok_packet/#server-status-flag] flag that explicitly indicate if a transaction is currently active. Java connector use that information to avoid issuing a rollback/commit command, skipping the command if there is no transaction. Problem concerns only MyISAM that never set SERVER_STATUS_IN_TRANS flag. Still there is some case when there is some kind of lock : ( example from serg: ) {code:sql} create table t1 (a int) engine=myisam; set autocommit=0; insert t1 values (1); {code} and in another {code:sql} drop table t1; {code} this {{DROP TABLE}} will wait until the transaction ends. * either MyISAM should return SERVER_STATUS_IN_TRANS flag, so connector know there is really a commit to be issued. * either MyISAM doesn't set any lock. (It may be just an issue : for some metadata locks are taken on the object *name*, before the table is opened, before we know it's a MyISAM table.) Either way is ok. (Another solution would be to always issue a COMMIT/ROLLBACK statement when there is no need, but that would degrade performance dramatically for some application. For example when connections are given back to pools, pools generally issues a connection.rollback() to ensure connection state, and there is lots of application where that command would represent 25% of the commands) |
_created after Synchronous connectors can rely on OK_Packet/EOF_Packet server status's [SERVER_STATUS_IN_TRANS |https://mariadb.com/kb/en/ok_packet/#server-status-flag] flag that explicitly indicate if a transaction is currently active. Java connector use that information to avoid issuing a rollback/commit command, skipping the command if there is no transaction. Problem concerns only MyISAM that never set SERVER_STATUS_IN_TRANS flag. Still there is some case when there is some kind of lock : ( example from serg: ) {code:sql} create table t1 (a int) engine=myisam; insert t1 values (1); {code} and in another {code:sql} drop table t1; {code} this {{DROP TABLE}} will wait until the transaction ends. * either MyISAM should return SERVER_STATUS_IN_TRANS flag, so connector know there is really a commit to be issued. * either MyISAM doesn't set any lock. (It may be just an issue : for some metadata locks are taken on the object *name*, before the table is opened, before we know it's a MyISAM table.) Either way is ok. (Another solution would be to always issue a COMMIT/ROLLBACK statement when there is no need, but that would degrade performance dramatically for some application. For example when connections are given back to pools, pools generally issues a connection.rollback() to ensure connection state, and there is lots of application where that command would represent 25% of the commands) |
Zendesk Related Tickets | 171314 |