Mysql Deadlock in Stored Procedure,composite unique key
1
vote
0
answers
580
views
I have a table with composite unique key(uniqueness on combination of 3 columns.) Table structure:
CREATE TABLE
userreview
(
cid
bigint(12) unsigned NOT NULL,
conid
bigint(12) unsigned NOT NULL,
userid
bigint(12) unsigned NOT NULL,
flag
int(12) unsigned NOT NULL DEFAULT '0',
updatedat
timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON
UPDATE CURRENT_TIMESTAMP(3),
UNIQUE KEY idx_userreview_cid_conid_userid
(cid
,conid
,userid
)
) ;
Below is stored procedure .
CREATE PROCEDURE testdeadlock
(IN pconid BIGINT(12), IN pcid
BIGINT(12), IN puserid BIGINT(12),IN pflag INT(1))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
IF pflag = 1 THEN
INSERT ignore into userreview(cid,conid,userid,flag)
VALUES(pcid,pconid,puserid,1)
ON DUPLICATE KEY UPDATE flag = 1;
/*update operation in table 1*/
ELSEIF pflag = 0 THEN
INSERT ignore into userreview(cid,conid,userid)
VALUES(pcid,pconid,puserid)
ON DUPLICATE KEY UPDATE flag = 0;
/*update operation in table 2*/
ELSEIF pflag = 2 THEN
INSERT ignore into userreview(cid,conid,userid)
VALUES(pcid,pconid,puserid)
ON DUPLICATE KEY UPDATE flag = 2;
/*update operation in table 3*/
end if;
COMMIT;
end;
When this procedure is executing from client side(using node.js),sometime it occurs deadlock when concurrent transactions are going to execute on same rows.Though there is unique index still facing deadlock problem. Is there any suggestion to avoid deadlock?
Deadlock result:-
LATEST DETECTED DEADLOCK
------------------------
2018-07-06 16:55:51 0x2b0b08e99700
*** (1) TRANSACTION:
TRANSACTION 102648166, ACTIVE 0 sec inserting
mysql tables in use 2, locked 2
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 108948, OS thread handle 47323865503488, query id 242017676 10.0.3.130 numbertankroot update
INSERT ignore into userreview(cid,conid,userid,flag)
VALUES( NAME_CONST('pcid',8157), NAME_CONST('pconid',3158), NAME_CONST('puserid',85217))
ON DUPLICATE KEY UPDATE flag = 0
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 735 page no 17308 n bits 256 index idx_userreview_cid_conid_userid of table userreview
trx id 102648166 lock_mode X waiting
Record lock, heap no 183 PHYSICAL RECORD: n_fields 15; compact format; info bits 0
0: len 8; hex 0000000000001fdd; asc ;;
1: len 8; hex 000000000005af9f; asc ;;
2: len 8; hex 00000000000bd0b7; asc ;;
3: len 6; hex 0000061e4965; asc Ie;;
4: len 7; hex 2800000eb42873; asc ( (s;;
5: len 1; hex 80; asc ;;
6: len 1; hex 84; asc ;;
7: len 4; hex 00000001; asc ;;
8: len 1; hex 01; asc ;;
9: len 8; hex 0000000000001fdd; asc ;;
10: len 4; hex 00000000; asc ;;
11: len 4; hex 00000000; asc ;;
12: len 4; hex 00000001; asc ;;
13: len 6; hex 5b3f9f170000; asc [? ;;
14: len 6; hex 5b3f9f17213e; asc [? !>;;
*** (2) TRANSACTION:
TRANSACTION 102648170, ACTIVE 0 sec inserting
mysql tables in use 2, locked 2
4 lock struct(s), heap size 1136, 2 row lock(s)
MySQL thread id 108960, OS thread handle 47326394160896, query id 242017689 10.0.3.130 numbertankroot update
INSERT ignore into userreview(cid,conid,userid,flag)
VALUES( NAME_CONST('pcid',8157), NAME_CONST('pconid',3158), NAME_CONST('puserid',85217))
ON DUPLICATE KEY UPDATE flag = 1
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 735 page no 17308 n bits 256 index idx_userreview_cid_conid_userid
of table userreview
trx id 102648170 lock mode S locks rec but not gap
Record lock, heap no 183 PHYSICAL RECORD: n_fields 15; compact format; info bits 0
0: len 8; hex 0000000000001fdd; asc ;;
1: len 8; hex 000000000005af9f; asc ;;
2: len 8; hex 00000000000bd0b7; asc ;;
3: len 6; hex 0000061e4965; asc Ie;;
4: len 7; hex 2800000eb42873; asc ( (s;;
5: len 1; hex 80; asc ;;
6: len 1; hex 84; asc ;;
7: len 4; hex 00000001; asc ;;
8: len 1; hex 01; asc ;;
9: len 8; hex 0000000000001fdd; asc ;;
10: len 4; hex 00000000; asc ;;
11: len 4; hex 00000000; asc ;;
12: len 4; hex 00000001; asc ;;
13: len 6; hex 5b3f9f170000; asc [? ;;
14: len 6; hex 5b3f9f17213e; asc [? !>;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 735 page no 17308 n bits 256 index idx_userreview_cid_conid_userid
of table userreview
trx id 102648170 lock_mode X waiting
Record lock, heap no 183 PHYSICAL RECORD: n_fields 15; compact format; info bits 0
0: len 8; hex 0000000000001fdd; asc ;;
1: len 8; hex 000000000005af9f; asc ;;
2: len 8; hex 00000000000bd0b7; asc ;;
3: len 6; hex 0000061e4965; asc Ie;;
4: len 7; hex 2800000eb42873; asc ( (s;;
5: len 1; hex 80; asc ;;
6: len 1; hex 84; asc ;;
7: len 4; hex 00000001; asc ;;
8: len 1; hex 01; asc ;;
9: len 8; hex 0000000000001fdd; asc ;;
10: len 4; hex 00000000; asc ;;
11: len 4; hex 00000000; asc ;;
12: len 4; hex 00000001; asc ;;
13: len 6; hex 5b3f9f170000; asc [? ;;
14: len 6; hex 5b3f9f17213e; asc [? !>;;
*** WE ROLL BACK TRANSACTION (1)
Asked by 5a01d01P
(135 rep)
Jul 19, 2018, 05:36 AM