MySQL InnoDB Deadlock 2 basit ekleme sorgusu için


10

Bu iki ekleme sorguları için bir kilitlenme var:

insert into PlayerClub (modifiedBy, timeCreated, currentClubId, endingLevelPosition, nextClubId, account_id) values (0, '2014-12-23 15:47:11.596', 180, 4, 181, 561)

insert into PlayerClub (modifiedBy, timeCreated, currentClubId, endingLevelPosition, nextClubId, account_id) values (0, '2014-12-23 15:47:11.611', 180, 4, 181, 563)

InnoDB Durumu:

------------------------
LATEST DETECTED DEADLOCK
------------------------
2014-12-23 15:47:11 1f4c
*** (1) TRANSACTION:
TRANSACTION 19896526, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 1
MySQL thread id 17988, OS thread handle 0x17bc, query id 5701353 localhost 127.0.0.1 root update
insert into PlayerClub (modifiedBy, timeCreated, currentClubId, endingLevelPosition,  nextClubId, account_id) values (0, '2014-12-23 15:47:11.596', 180, 4, 181, 561)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 49735 page no 4 n bits 72 index `UK_cagoa3q409gsukj51ltiokjoh` of   table `db`.`playerclub` trx id 19896526 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

*** (2) TRANSACTION:
TRANSACTION 19896542, ACTIVE 0 sec inserting, thread declared inside InnoDB 5000
mysql tables in use 1, locked 1
5 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 1
MySQL thread id 17979, OS thread handle 0x1f4c, query id 5701360 localhost 127.0.0.1    root update
insert into PlayerClub (modifiedBy, timeCreated, currentClubId, endingLevelPosition,   nextClubId, account_id) values (0, '2014-12-23 15:47:11.611', 180, 4, 181, 563)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 49735 page no 4 n bits 72 index `UK_cagoa3q409gsukj51ltiokjoh` of   table `db`.`playerclub` trx id 19896542 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 49735 page no 4 n bits 72 index `UK_cagoa3q409gsukj51ltiokjoh` of    table `db`.`playerclub` trx id 19896542 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

*** WE ROLL BACK TRANSACTION (2)

Bu tablodaki tek yabancı anahtar "account_id" dir.

Herhangi bir fikir?

EDIT: İşte benim PlayerClub bilgilerim:

CREATE TABLE `PlayerClub` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `modifiedBy` bigint(20) DEFAULT NULL,
  `timeCreated` datetime NOT NULL,
  `account_id` bigint(20) DEFAULT NULL,
  `currentClubId` bigint(20) DEFAULT NULL,
  `endingLevelPosition` int(11) NOT NULL,
  `nextClubId` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_cagoa3q409gsukj51ltiokjoh` (`account_id`),
  KEY `FK_cagoa3q409gsukj51ltiokjoh` (`account_id`),
  CONSTRAINT `FK_cagoa3q409gsukj51ltiokjoh` FOREIGN KEY (`account_id`) REFERENCES   `PlayerAccount` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1

Kilitlenmeye çarpmadan önce her işlemde başka ne yaptınız?
Michael - sqlbot

her bir eklemeden sonra kesinleştirme yaparsanız ve sonra denerseniz ne olur? Bize bildirin ..
Nawaz Sohail

SHOW CREATE TABLE PlayerClubLütfen. Bu genellikle dizinlerle ilgilidir.
Jehad Keriaki

Yanıtlar:


13

BURADA GERÇEKLER

İşte iki INSERT

insert into PlayerClub (modifiedBy, timeCreated, currentClubId, endingLevelPosition, nextClubId, account_id) values (0, '2014-12-23 15:47:11.596', 180, 4, 181, 561)
insert into PlayerClub (modifiedBy, timeCreated, currentClubId, endingLevelPosition, nextClubId, account_id) values (0, '2014-12-23 15:47:11.611', 180, 4, 181, 563)

İşte sizin iki satır SHOW ENGINE INNODB STATUS\G

RECORD LOCKS space id 49735 page no 4 n bits 72 index `UK_cagoa3q409gsukj51ltiokjoh` of   table `db`.`playerclub` trx id 19896526 lock_mode X insert intention waiting
RECORD LOCKS space id 49735 page no 4 n bits 72 index `UK_cagoa3q409gsukj51ltiokjoh` of   table `db`.`playerclub` trx id 19896542 lock_mode X

GÖZLEM

561 ve 563 olmak üzere iki farklı account_id ile INSERT yapıyorsunuz.

Bunlar benzersizdir ve sorunları olmamalıdır, değil mi? YANLIŞ !!!

InnoDB'nin Kümelenmiş Dizini nedeniyle, hala bir kilitlenme olabilir. Neden ?

İki INSERT'inize tekrar bakın. Açık PRIMARY KEYkimliği belirtilmedi. Otomatik olarak oluşturulmalıdır. PRIMARY KEY (benzersiz veya benzersiz olmayan) dışında herhangi bir tuşa PRIMARY KEY eklenir.

Lütfen bir İkincil Dizin ve aa Birincil Anahtarın nasıl iç içe geçtiği ile ilgili MySQL Belgelerine dikkat edin :

Kümelenmiş dizin dışındaki tüm dizinler ikincil dizinler olarak bilinir. InnoDB'de, ikincil bir dizindeki her kayıt, satır için birincil anahtar sütunlarının yanı sıra ikincil dizin için belirtilen sütunları içerir. InnoDB, kümelenmiş dizindeki satırı aramak için bu birincil anahtar değerini kullanır.

Birincil anahtar uzunsa, ikincil dizinler daha fazla alan kullanır, bu nedenle kısa bir birincil anahtara sahip olmak avantajlıdır.

Her ne kadar sen insert olan kaputun altında, ACCOUNT_ID 561 ve 563 ekleme edilir 561-(id)ve 563-(id)içine UK_cagoa3q409gsukj51ltiokjohindeksi. PRIMARY KEYKadar İkincil Endeksi bekleme zorunda olduğu için darboğaz haline idsütun auto_generated edilir.

ÖNERİ

İki aday anahtarlı bir masanız var

  • PRIMARY KEY üzerinde id
  • UNIQUE KEY üzerinde UK_cagoa3q409gsukj51ltiokjoh

Her ikisi de olduğundan BIGINT, bu kilitlenme durumundan kaçınmanın yanı sıra PlayerClubkurtulup idbenzersizliğini koruyarak performansı artırabilir ve daha küçük bir masaya sahip olabilirsiniz UK_cagoa3q409gsukj51ltiokjoh.


1
Yalnızca kaldırdıktan sonra Bu tablodaki tek yabancı anahtar "account_id", kilitlenme durması oluşuyor.
Urbanleg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.