Topic: Duplicate entry '*****' for key 2

Taigi pastaruoju metu padaugėjo klaidų, kurios nežinia iš ko kyla. Va gaunu į paštą laiškelį:

Time: 2010-01-28 03:00:20
Server: programmer.lt
IP: 79.98.25.186
User agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1
Error:
MySql query: INSERT INTO p_servers(server_id, server_ip, server_name, country, continent_code, country_code, country_code2, region, city, postal_code, koord1, koord2, dma_code, area_code, updated) VALUES(NULL, '212.61.252.88', 'srv252088.webreus.nl', 'Netherlands', 'EU', 'NL', 'NLD', '06', 'Eindhoven', '', '51.450000762939', '5.4667000770569', '0', '0', NOW())
MySql error no: 1062
MySql error: Duplicate entry '212.61.252.88' for key 2

Pasitikrinu ir tikrai toks IP jau yra, tačiau įrašo sukūrimo laikas: 2010-01-28 03:00:20 , lygiai tuo pačiu metu kai įvyko klaida. Tokio tipo klaidos padažnėjo dadidėjus įrašų kiekiui, nors jis ir nėra labai didelis ~70K . O pati lentelė atrodo taip:

CREATE TABLE IF NOT EXISTS `p_servers` (
  `server_id` bigint(20) NOT NULL auto_increment,
  `server_ip` varchar(100) NOT NULL,
  `server_name` varchar(255) NOT NULL,
  `continent_code` varchar(50) NOT NULL,
  `country` varchar(255) NOT NULL,
  `country_code` varchar(10) NOT NULL,
  `country_code2` varchar(20) NOT NULL,
  `region` varchar(50) NOT NULL,
  `city` varchar(255) NOT NULL,
  `postal_code` int(11) NOT NULL,
  `koord1` varchar(100) NOT NULL,
  `koord2` varchar(100) NOT NULL,
  `dma_code` varchar(50) NOT NULL,
  `area_code` varchar(50) NOT NULL,
  `updated` datetime NOT NULL,
  PRIMARY KEY  (`server_id`),
  UNIQUE KEY `server_ip` (`server_ip`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=72680 ;

Gal kas žino kokią priežastį kodėl taip įvyksta?

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: Duplicate entry '*****' for key 2

Na tai aš taip įsivaizduoju, kad tą pačia sekundę, dėl tam tikrų priežaščių (pvz refresh) bandomas antras duomenų įterpimas ir pažeidžiamas unikalaus rakto indeksas. Tokiu atveju reikėtų apdoroti klaidos pranešimą ir pagal grąžintą klaidos kodą (numerį), identifikuojantį, kad buvo DUP KEY VIOLATION, spręsti ką toliau daryti (-;

Re: Duplicate entry '*****' for key 2

Ten eina dvi užklausos viena po kitos, pirmoji atlieka COUNT() pagal IP, ir jei grąžina 0 tada atlieka INSERT , kažkaip sunkiai tikėtina,  kad du skriptai pasileido idealiai tokiu pačiu laiku ir pataikė ant tokių pačių COUNT() rezultatų ... O gal mysql tuo metu naujina indeksus...

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: Duplicate entry '*****' for key 2

O ką daro ta užklausa su COUNT() ? Realiai gal tik atsako į klausimą ar toks įrašas jau yra?
Jeigu taip, tai aš ir rekomenduoju - jos visai atsisakyti, o vadovautis tik INSERT grąžinamu klaidos kodu. čia gal ir nepati geriausia taktika, bet man rodos ji bent jau greitesnė/optimalesnė.

Dar kartais tie COUNT() pasako programai, ką toliau dayrti INSERT ar UPDATE, tai tokiu atveju rekomenduočiau pasinagrinėti REPLACE, kuri atliks INSERT jeigu tokio įrašo dar nebus ir UPDATE jeigu bus.

Kas dėl galimybių, kad tavo atveju kažkokį grybą pjauna MySQL'as tai 99.999%, kad ne. Greičiausiai scriptai vykdomi vienu metu arba nuosekliai iš karto vienas po kito. Tokioje vietoje reikėtų pasidaryti kažkokį debug/log, kuris esant tokiom situacijom (kaip minėjai gana dažnom) tau greitai atsakytų į šį klausimą.

Re: Duplicate entry '*****' for key 2

Oba REPLACE nežinojau ...
Bet čia tiesiog jei yra irašas tai nieko nebedaro. Ok bandysiu dar debuginti, tik šiaip pabandžiau pataupyti laiko, kurio sunkiai berandu žaidimams :(

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: Duplicate entry '*****' for key 2

Jeigu įrašas bus, tai REPLACE atliks tą patį, kaip UPDATE. Jeigu tau netinka toks funkcionalumas - nekreip į jį dėmesio (-;

Re: Duplicate entry '*****' for key 2

Buvai teisus, keli pageview pareina vienu metu...

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer