{"id":333,"date":"2014-10-26T14:47:10","date_gmt":"2014-10-26T13:47:10","guid":{"rendered":"http:\/\/zsteva.info\/?p=333"},"modified":"2014-10-26T14:47:54","modified_gmt":"2014-10-26T13:47:54","slug":"paralelno-procesiranje-podataka-u-mysqlu","status":"publish","type":"post","link":"http:\/\/zsteva.info\/blog\/2014\/10\/paralelno-procesiranje-podataka-u-mysqlu\/","title":{"rendered":"Paralelno procesiranje podataka u MySQLu"},"content":{"rendered":"<p>Kod paralelne obrade podataka koji se nalaze u MySQL tabeli kao mehanizam zaklju\u010davanja odavno koristim polje u koje upisujem ID od procesa koji obra\u0111uje trenutno neki slog. Ali se kao problem postavi \u0161ta se desi ako neki od tih procesa umre, i odre\u0111eni slog ostane zaklju\u010dan od strane procesa koji je umro i nikad ga ne\u0107e otklj\u010dati.<\/p>\n<p>Ranije sam za to koristio file lock i scriptu koja monitori\u0161e da li je neki child umro i u tom slu\u010daju jednostavno osloba\u0111a sve \u0161to je taj proces imao zaklju\u010dano. Ali, postoji mnogo jednostavnije i lak\u0161e re\u0161enje bez file lockova i procesa za monitoring.<\/p>\n<p>Primer tabele:<\/p>\n<pre lang=\"sql\">\r\nCREATE TABLE `dataobj` (\r\n  `id` int(11) NOT NULL,\r\n  `connection_id` int(11) NOT NULL DEFAULT '0',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=MyISAM DEFAULT CHARSET=utf8;\r\n<\/pre>\n<p>Process zaklju\u010davanja odre\u0111enog broja slogova koje \u0107emo procesirati:<\/p>\n<pre lang=\"sql\">\r\nUPDATE dataobj\r\nSET connection_id = CONNECTION_ID()\r\nWHERE 1=1\r\nAND (connection_id = 0 OR connection_id NOT IN (SELECT id FROM information_schema.processlist))\r\nLIMIT 2;\r\n<\/pre>\n<p>U where imamo kriterijum koji selektuje samo nezaklju\u010dane slogove ( connection_id = 0 ), kao i one koji su zaklju\u010dane od strane scripte koje su umrle (otka\u010dile se sa baze). 1=1 je dodatni kriterijum ako \u017eelimo samo odre\u0111ene slogove da obra\u0111ujemo. A limit nam kontroli\u0161e kolko slogova \u017eelimo da preuzmemo za obradu.<\/p>\n<p>Potom je potrebno da pokupimo one koje smo uspe\u0161no zaklju\u010dali:<\/p>\n<pre lang=\"sql\">\r\nSELECT * FROM dataobj WHERE connection_id = CONNECTION_ID()\r\n<\/pre>\n<p>Po zav\u0161enom poslu za odklju\u010davanje mo\u017eemo da uradimo jednostavno setovanje connection_id polja na nulu.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kod paralelne obrade podataka koji se nalaze u MySQL tabeli kao mehanizam zaklju\u010davanja odavno koristim polje u koje upisujem ID od procesa koji obra\u0111uje trenutno neki slog. Ali se kao problem postavi \u0161ta se desi ako neki od tih procesa &hellip; <a href=\"http:\/\/zsteva.info\/blog\/2014\/10\/paralelno-procesiranje-podataka-u-mysqlu\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[119],"tags":[108],"_links":{"self":[{"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/posts\/333"}],"collection":[{"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/comments?post=333"}],"version-history":[{"count":4,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/posts\/333\/revisions"}],"predecessor-version":[{"id":337,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/posts\/333\/revisions\/337"}],"wp:attachment":[{"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/media?parent=333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/categories?post=333"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/tags?post=333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}