Sample Header Ad - 728x90

Weird behaviour with batch and trigger(MariaDB)

1 vote
1 answer
141 views
I found a weird issue involving mariadb. batch update from hibernate. the original question was added here : https://stackoverflow.com/questions/78204056/hibernate-sqlintegrityconstraintviolation-duplicate-data-entry-issue-after-upg?noredirect=1#comment138316709_78204056 table t_instancetest CREATE TABLE t_instancetest ( RATEID BIGINT(10) NOT NULL, BID VARCHAR(25) NULL DEFAULT NULL COLLATE 'utf8_bin', ASK VARCHAR(25) NULL DEFAULT NULL COLLATE 'utf8_bin', MID VARCHAR(25) NULL DEFAULT NULL COLLATE 'utf8_bin', UPDATEDDATE DATETIME(6) NULL DEFAULT NULL, INSTANCEUPDATEDDATE DATETIME(6) NULL DEFAULT NULL, UPDATEDBY VARCHAR(30) NULL DEFAULT NULL COLLATE 'utf8_bin', CRUD VARCHAR(1) NULL DEFAULT NULL COLLATE 'utf8_bin', CREATEDBY VARCHAR(30) NULL DEFAULT NULL COLLATE 'utf8_bin', INSTANCEUPDATEDBY VARCHAR(30) NULL DEFAULT NULL COLLATE 'utf8_bin', LOCATIONID INT(3) NOT NULL, PRIMARY KEY (RATEID, LOCATIONID) USING BTREE )COLLATE='utf8_bin' ENGINE=InnoDB ; audit log CREATE TABLE t_datalog ( Id BIGINT(10) NOT NULL AUTO_INCREMENT, RateId BIGINT(10) NOT NULL, CreatedDate DATETIME(6) NOT NULL, PRIMARY KEY (Id) USING BTREE )) COLLATE='utf8_bin' ENGINE=InnoDB AUTO_INCREMENT=232 ; TRIGGER (BEFORE UPDATE ) - but this field later removed to make it easier to test - and this trigger dropped. CREATE DEFINER=USERADMIN@% TRIGGER TRG_BU_T_INSTANCE. BEFORE UPDATE ON t_instance FOR EACH ROW BEGIN SET NEW.ATTRCHANGEID=UUID(); END TRIGGER (AFTER UPDATE) CREATE DEFINER=USERADMIN@% TRIGGER TRG_AU_T_INSTANCETEST AFTER UPDATE ON t_instancetest FOR EACH ROW BEGIN INSERT INTO t_datalog ( RateId, CreatedDate) VALUES (OLD.RATEID, sysdate()); END Batch update from application ( batchsize = 7)-as can be shown here, it update 7 different rateids 2024-05-10 12:31:59.814 INFO 3472 --- [nio-9012-exec-2] n.t.d.l.l.SLF4JQueryLoggingListener : {"name":"reliableDataSource", "connection":3, "time":13, "success":true, "type":"Prepared", "batch":true, "querySize":1, "batchSize":7, "query":["update t_instancetest set ask=?, bid=?, createdby=?, crud=?, instanceupdateddate=?, locationId=?, mid=?, updatedby=?, updateddate=? where locationid=? and rateId=?"], "params":[["116.13","12.23","SYSTEM","U","2024-05-10 12:31:59.665","101","7181","naga","2024-05-10 12:03:55.0","101","7181"], ["116.13","12.23","SYSTEM","U","2024-05-10 12:31:59.665","101","7239","naga","2024-05-10 12:03:55.0","101","7239"], ["116.13","12.23","SYSTEM","U","2024-05-10 12:31:59.665","101","7254","naga","2024-05-10 12:03:55.0","101","7254"], ["116.13","12.23","SYSTEM","U","2024-05-10 12:31:59.665","101","7265","naga","2024-05-10 12:03:55.0","101","7265"], ["116.13","12.23","SYSTEM","U","2024-05-10 12:31:59.665","101","7370","naga","2024-05-10 12:03:55.0","101","7370"], ["116.13","12.23","SYSTEM","U","2024-05-10 12:31:59.665","101","7453","naga","2024-05-10 12:03:55.0","101","7453"], ["116.13","12.23","SYSTEM","U","2024-05-10 12:31:59.665","101","7643","naga","2024-05-10 12:03:55.0","101","7643"]]} Mariadb logs , however showing we are only updating one record in t_instancetest and execute trigger 7 times on the same rateid. other rateid were not executed. #240509 17:27:01 server id 2 end_log_pos 127297238 CRC32 0x5e6a5fa7 Write_rows: table id 3067 flags: STMT_END_F ### UPDATE reliabledb.t_instance ### WHERE ### @1=7181 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2='12.23' /* VARSTRING(75) meta=75 nullable=1 is_null=0 */ ### @3='116.13' /* VARSTRING(75) meta=75 nullable=1 is_null=0 */ ### @4='' /* VARSTRING(75) meta=75 nullable=1 is_null=0 */ ### @5='2024-05-09 16:49:54.962888' /* DATETIME(6) meta=6 nullable=1 is_null=0 */ ### @6='2024-05-09 17:22:52.812000' /* DATETIME(6) meta=6 nullable=1 is_null=0 */ ### @7='naga' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */ ### @8='U' /* VARSTRING(3) meta=3 nullable=1 is_null=0 */ ### @9='SYSTEM' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */ ### @10='naga' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */ ### @11=101 /* INT meta=0 nullable=0 is_null=0 */ ### SET ### @1=7181 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2='12.23' /* VARSTRING(75) meta=75 nullable=1 is_null=0 */ ### @3='116.13' /* VARSTRING(75) meta=75 nullable=1 is_null=0 */ ### @4='7181' /* VARSTRING(75) meta=75 nullable=1 is_null=0 */ ### @5='2024-05-09 16:49:54.962888' /* DATETIME(6) meta=6 nullable=1 is_null=0 */ ### @6='2024-05-09 17:27:01.116000' /* DATETIME(6) meta=6 nullable=1 is_null=0 */ ### @7='naga' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */ ### @8='U' /* VARSTRING(3) meta=3 nullable=1 is_null=0 */ ### @9='SYSTEM' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */ ### @10='naga' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */ ### @11=101 /* INT meta=0 nullable=0 is_null=0 */ ### INSERT INTO reliabledb.t_datalog ### SET ### @1=98 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2=7181 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @3='2024-05-09 17:27:01.000000' /* DATETIME(6) meta=6 nullable=0 is_null=0 */ ### INSERT INTO reliabledb.t_datalog ### SET ### @1=99 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2=7181 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @3='2024-05-09 17:27:01.000000' /* DATETIME(6) meta=6 nullable=0 is_null=0 */ ### INSERT INTO reliabledb.t_datalog ### SET ### @1=100 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2=7181 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @3='2024-05-09 17:27:01.000000' /* DATETIME(6) meta=6 nullable=0 is_null=0 */ ### INSERT INTO reliabledb.t_datalog ### SET ### @1=101 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2=7181 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @3='2024-05-09 17:27:01.000000' /* DATETIME(6) meta=6 nullable=0 is_null=0 */ ### INSERT INTO reliabledb.t_datalog ### SET ### @1=102 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2=7181 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @3='2024-05-09 17:27:01.000000' /* DATETIME(6) meta=6 nullable=0 is_null=0 */ ### INSERT INTO reliabledb.t_datalog ### SET ### @1=103 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2=7181 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @3='2024-05-09 17:27:01.000000' /* DATETIME(6) meta=6 nullable=0 is_null=0 */ # Number of rows: 7 # at 127297238 #240509 17:27:01 server id 2 end_log_pos 127297269 CRC32 0xd7928418 Xid = 205571784 COMMIT/*!*/; If we drop the trigger, the insertion completed normally (all record updated ). Also if we remove the batch, the behaviour the insertion will completed also. The issue only happened if batch size > 3 and trigger are in effect. Anyone can share any idea on why this is happening? or maybe point to a mariadb bug that might interfere with this? It only happens for this table on the schema, where the other table are not affected. version details: - mariadb 10.5 - mariadb jdbc client 3.3.3 ( also tried with 2.7.4 ) - spring boot ( java ) 2.7.18 - hibernate 5.6.15
Asked by Rudy (151 rep)
May 10, 2024, 07:40 AM
Last activity: May 16, 2024, 07:31 AM