{"id":13,"date":"2008-12-23T09:35:00","date_gmt":"2008-12-23T09:35:00","guid":{"rendered":"http:\/\/www.vcrini.com\/impressioni\/?p=13"},"modified":"2008-12-23T09:35:00","modified_gmt":"2008-12-23T09:35:00","slug":"database-thread-e-transazioni","status":"publish","type":"post","link":"https:\/\/www.vcrini.com\/impressioni\/?p=13","title":{"rendered":"database, thread e transazioni"},"content":{"rendered":"<p>Proprio in questi giorni a lavoro mi sono imbattuto in un problema non banale riguardo le transazioni dei database.<br \/>Avevo 2 <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_0\">thread<\/span> <span style=\"font-weight: bold;\">A<\/span> che scriveva su <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_1\">db<\/span> e <span style=\"font-weight: bold;\">B<\/span> che doveva leggere il dato.<br \/>Nel mio flusso ideale la cosa avrebbe dovuto funzionare cos\u00ec<\/p>\n<p><a onblur=\"try {parent.deselectBloggerImageGracefully();} catch(e) {}\" href=\"http:\/\/1.bp.blogspot.com\/_wbWASnboBbU\/SVC-iuGoB0I\/AAAAAAAABmE\/W_cVIz8cEr4\/s1600-h\/path3465.png\"><img style=\"margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 81px; height: 166px;\" src=\"http:\/\/1.bp.blogspot.com\/_wbWASnboBbU\/SVC-iuGoB0I\/AAAAAAAABmE\/W_cVIz8cEr4\/s400\/path3465.png\" alt=\"\" id=\"BLOGGER_PHOTO_ID_5282931866606241602\" border=\"0\" \/><\/a><br \/>invece dopo qualche ora spesa a cercare di capire come mai B fallisse sempre a leggere i dati e dopo aver controllato l&#8217;<span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_4\">access<\/span> <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_5\">log<\/span> mi sono accorto che B leggeva i dati prima che A li avesse scritti!<\/p>\n<p>quindi succedeva che<\/p>\n<p><a onblur=\"try {parent.deselectBloggerImageGracefully();} catch(e) {}\" href=\"http:\/\/2.bp.blogspot.com\/_wbWASnboBbU\/SVC-8vz9-FI\/AAAAAAAABmM\/crvRYxqrrg0\/s1600-h\/path3495.png\"><img style=\"margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 81px; height: 166px;\" src=\"http:\/\/2.bp.blogspot.com\/_wbWASnboBbU\/SVC-8vz9-FI\/AAAAAAAABmM\/crvRYxqrrg0\/s400\/path3495.png\" alt=\"\" id=\"BLOGGER_PHOTO_ID_5282932313741457490\" border=\"0\" \/><\/a><br \/>Visto che l&#8217;ordine di esecuzione non poteva essere previsto ho dovuto creare in B un meccanismo che tentasse di leggere il dato pi\u00f9 volte o fino a soddisfare la lettura, o fino a raggiungere un numero massimo di tentativi ed uscire con errore.<\/p>\n<p>quindi ho fatto una cosa del genere<\/p>\n<p><a onblur=\"try {parent.deselectBloggerImageGracefully();} catch(e) {}\" href=\"http:\/\/1.bp.blogspot.com\/_wbWASnboBbU\/SVC_OGhOROI\/AAAAAAAABmU\/1JuB85pm5K0\/s1600-h\/text3389.png\"><img style=\"margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 81px; height: 370px;\" src=\"http:\/\/1.bp.blogspot.com\/_wbWASnboBbU\/SVC_OGhOROI\/AAAAAAAABmU\/1JuB85pm5K0\/s400\/text3389.png\" alt=\"\" id=\"BLOGGER_PHOTO_ID_5282932611894625506\" border=\"0\" \/><\/a><br \/>Ma qui sono successe cose sinistre.<\/p>\n<p>Infatti dall&#8217;<span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_6\">access<\/span> <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_7\">log<\/span> risultata che A aveva scritto il dato mentre B che aveva iniziato a leggerlo precedentemente falliva anche quando A aveva terminato la sua scrittura.<br \/>Grazie all&#8217;aiuto dei miei colleghi pi\u00f9 esperti mi \u00e8 stato spiegato che B iniziava la sua transazione prima della fine della scrittura da parte di  A e B, per consistenza, manteneva lo stato iniziale di fallimento di ricerca del dato. Quindi anche se avessi letto quel valore per ore dopo che A lo aveva scritto avrei sempre trovato la situazione iniziale della base dati ovvero nessun dato trovato!<\/p>\n<p><a onblur=\"try {parent.deselectBloggerImageGracefully();} catch(e) {}\" href=\"http:\/\/3.bp.blogspot.com\/_wbWASnboBbU\/SVC-IOiQauI\/AAAAAAAABl8\/ZzSpyXPqJJg\/s1600-h\/1.jpg.png\"><img style=\"margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 252px; height: 376px;\" src=\"http:\/\/3.bp.blogspot.com\/_wbWASnboBbU\/SVC-IOiQauI\/AAAAAAAABl8\/ZzSpyXPqJJg\/s400\/1.jpg.png\" alt=\"\" id=\"BLOGGER_PHOTO_ID_5282931411455601378\" border=\"0\" \/><\/a><\/p>\n<p>Armato di sana pazienza e spulciando la documentazione del <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_8\">DB<\/span> (<span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_9\">mysql<\/span> in questo caso ma tutti i moderni <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_10\">db<\/span> con supporto alla transazioni hanno l&#8217;equivalente istruzione)  ho trovato alla fine il comando che disabilita questo comportamento ovvero:<\/p>\n<p>set <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_11\">transaction<\/span> <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_12\">isolation<\/span> <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_13\">level<\/span> <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_14\">read<\/span> <span class=\"blsp-spelling-error\" id=\"SPELLING_ERROR_15\">committed<\/span>;<\/p>\n<p>Con questo comando B \u00e8 stato in grado di accorgersi quando il dato \u00e8 divenuto disponibile ed io ho risolto il mio gravoso problema.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Proprio in questi giorni a lavoro mi sono imbattuto in un problema non banale riguardo le transazioni dei database.Avevo 2 thread A che scriveva su db e B che doveva leggere il dato.Nel mio flusso ideale la cosa avrebbe dovuto &hellip; <a href=\"https:\/\/www.vcrini.com\/impressioni\/?p=13\">Continua a leggere<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":{"_mi_skip_tracking":false},"categories":[22,20,21],"tags":[],"_links":{"self":[{"href":"https:\/\/www.vcrini.com\/impressioni\/index.php?rest_route=\/wp\/v2\/posts\/13"}],"collection":[{"href":"https:\/\/www.vcrini.com\/impressioni\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vcrini.com\/impressioni\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vcrini.com\/impressioni\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vcrini.com\/impressioni\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=13"}],"version-history":[{"count":0,"href":"https:\/\/www.vcrini.com\/impressioni\/index.php?rest_route=\/wp\/v2\/posts\/13\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.vcrini.com\/impressioni\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vcrini.com\/impressioni\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vcrini.com\/impressioni\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}