I'm confused as to why this happen, because to my understanding a before insert trigger will get fired for every new row, which do work when I run the code synchronously. But because my data can be quite a lot, I'm trying to make it asynchronous.
For example, I tried to insert two transaction headers which should fire the trigger twice to generate each transaction number, but it only generate one number for both rows.
Below is my trigger code :
CREATE DEFINER=`root`@`%` TRIGGER `generate_transaction_number`
BEFORE INSERT ON `transaction`
FOR EACH ROW BEGIN
DECLARE v_max_transaction_num VARCHAR(17);
DECLARE v_separator VARCHAR(1) DEFAULT '/';
SELECT MAX(transaction_number) INTO v_max_transaction_num from transaction t WHERE DATE(t.transaction_date) = CURDATE();
IF(v_max_transaction_num IS NULL OR v_max_transaction_num = '') THEN
SET v_max_transaction_num = '0';
END IF;
SET new.transaction_number = concat('INV', v_separator, DATE_FORMAT(CURDATE(),'%Y%m%d'), v_separator, LPAD(SUBSTRING_INDEX(v_max_transaction_num,v_separator,-1)+1,4,'0'));
END
Below is the javascript async code :
let promises = [];
for (const transactionHeader of transactionHeaders){
promises.push(mTransactions.addTransaction(transactionHeader));
}
await Promise.allSettled(promises);
My goal is to make it asynchronous, but and make the trigger fired for every row.