{"id":1057,"date":"2023-06-08T12:42:08","date_gmt":"2023-06-08T12:42:08","guid":{"rendered":"https:\/\/tarkvara.thkit.ee\/veeb\/?page_id=1057"},"modified":"2023-06-08T12:44:45","modified_gmt":"2023-06-08T12:44:45","slug":"transaktsioonid-transaction","status":"publish","type":"page","link":"https:\/\/tarkvara.thkit.ee\/veeb\/transaktsioonid-transaction\/","title":{"rendered":"Transaktsioonid (Transaction)"},"content":{"rendered":"\n<p>Transaktsioonid on tegevused, kus k\u00f5ik tegevused kas \u00f5nnestuvad edukalt v\u00f5i ei \u00f5nnestu \u00fcldse. SQL Server tunnistab kahte t\u00fc\u00fcpi transaktsioone:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automaatsed transaktsioonid \u2013 Server tekitab need ise k\u00f5igi muutmistegevustega st UPDATE, INSERT ja DELETE lausetega. Sisuliselt t\u00e4hendab see seda, et kui nt \u00fcritate muuta 10 kirje v\u00e4\u00e4rtust ja \u00fche kirje v\u00e4\u00e4rtuse muutmine ei \u00f5nnestu, siis ei muudeta neist \u00fchtegi.<\/li>\n\n\n\n<li>K\u00e4sitsi tehtud transaktsioonid \u2013 Programmeerija loodud tegevuste jadad, mis peavad k\u00f5ik \u00f5nnestuma.<\/li>\n<\/ul>\n\n\n\n<p>Transaktsiooni tekitamiseks on k\u00e4sk BEGIN TRAN. Selle j\u00e4rele tulevad k\u00f5ik soovitud tegevused. Kui transaktsioon l\u00f5peb edukalt, siis saab selle l\u00f5petada k\u00e4suga COMMIT TRAN. Kui midagi l\u00e4heb valesti, saab selle tagasi kerida k\u00e4suga ROLLBACK TRAN.<\/p>\n\n\n\n<p>Vaatame n\u00e4iteks, kuidas v\u00f5iks luua protseduuri panga\u00fclekandeks. Kuna SQL Server 2005 tunnistab uut TRY CATCH konstruktsiooni vigade haldamiseks, siis vaatleme seda n\u00e4idet nii SQL Server 2000 kui ka SQL Server 2005 baasil.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE PROC ylekanne2\n\t@kellelt int,\n\t@kellele int,\n\t@summa money\nAS\n\tBEGIN TRAN\n\tBEGIN TRY\n\t\tUPDATE konto\n\t\tSET jaak = jaak - @summa\n\t\tWHERE omanik = @kellelt\n\t\tUPDATE konto\n\t\tSET jaak = jaak + @summa\n\t\tWHERE omanik = @kellele\n\tEND TRY\n\tBEGIN CATCH\n\t\tIF @@trancount &gt; 0\n\t\t\tROLLBACK TRAN\n\tEND CATCH\n\n\tIF @@TRANCOUNT &gt; 0\n\t\tCOMMIT TRANSACTION;\n<\/pre><\/div>\n\n\n<p>Samast raha \u00fclekandmisest n\u00fc\u00fcd pikem n\u00e4ide. Pigem j\u00e4\u00e4gu \u00fclekanne teostamata, kui et toimingu sees osa raha \u00e4ra kaob v\u00f5i juurde tekib. Et kontodega toimetada, sai loodud v\u00f5imalikult lihtne tabel \u2013 vaid konto number ning seal olev saldo.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ncreate table kontod(\n  id int identity not null primary key,\n  saldo money\n)\n<\/pre><\/div>\n\n\n<p>Edasi luuakse salvestatud protseduur raha \u00fclekandeks. Kust kontolt v\u00f5tta, kuhu panna ning kui suur on summa. Esimesed kaks arvu t\u00e4hendavad siis vastavate kontode numbreid.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ncreate procedure ylekanne \n  (@kust int, @kuhu int, @summa money)\nas\n<\/pre><\/div>\n\n\n<p>Abimuutujas hoitakse meeles, kas k\u00f5ik \u00f5nnestus h\u00e4sti.<\/p>\n\n\n\n<p><em>declare @korras as int<\/em><\/p>\n\n\n\n<p>Esialgu probleeme pole, nii et @korras saab v\u00e4\u00e4rtuseks 1.<\/p>\n\n\n\n<p><em>set @korras=1<\/em><\/p>\n\n\n\n<p>Kogu j\u00e4rgnev toiming pannakse transaktsiooni sisse. See t\u00e4hendab, et sealsed muutused kas toimivad tervikuna v\u00f5i j\u00e4\u00e4vad sootuks \u00e4ra.<\/p>\n\n\n\n<p><em>begin transaction<\/em><\/p>\n\n\n\n<p>K\u00f5igepealt kontrollitakse, kas esimeselt kontolt on v\u00f5imalik vastav summa maha v\u00f5tta. Kui saab, siis v\u00f5etakse, muul juhul v\u00e4ljastatakse veateade ja muutujasse @korras antakse teada, et kord l\u00e4ks kaduma.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n     if (select saldo from kontod where id=@kust)&gt;=@summa begin\n        update kontod set saldo=saldo-@summa where id=@kust\n     end else begin\n        set @korras=0\n        raiserror(&#039;raha otsas&#039;, 1, 1)\n     end\n<\/pre><\/div>\n\n\n<p>J\u00e4rgmise sammuga kontrollitakse, et ka see konto ikka olemas on, kuhu raha kanda soovitakse. Hariliku UPDATE-lause puhul ei antaks isegi veateadet juhul, kui saajakontot olemas poleks. Siinse kontrolliga aga tehakse olemasolu kindlaks ja vaid sel juhul suurendatakse sealset summat. Muul juhul j\u00e4etakse j\u00e4lle meelde, et asjad pole korras.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n     if exists(select saldo from kontod where id=@kuhu) begin\n        update kontod set saldo=saldo+@summa where id=@kuhu\n     end else begin\n        set @korras=0\n     end\n<\/pre><\/div>\n\n\n<p>Edasi j\u00e4\u00e4b \u00fcle vaid muutuja j\u00e4rgi otsustada, kas toiming kinnitada v\u00f5i tagasi l\u00fckata.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nif @korras=1\n   commit transaction\nelse begin\n   rollback transaction\n   print &#039;probleem&#039;\nend\n<\/pre><\/div>\n\n\n<p>Ja et protseduuri k\u00e4ivitamise tulemusena oleks ka kontode operatsioonij\u00e4rgset seisu n\u00e4ha, selleks l\u00f5ppu \u00fcks SELECT-lause.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nselect * from kontod where id in (@kust, @kuhu)\n<\/pre><\/div>\n\n\n<p>Ning kood tervikuna.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ncreate procedure ylekanne \n  (@kust int, @kuhu int, @summa money)\nas\ndeclare @korras as int\nset @korras=1\nbegin transaction\n     if (select saldo from kontod where id=@kust)&gt;=@summa begin\n        update kontod set saldo=saldo-@summa where id=@kust\n     end else begin\n        set @korras=0\n        raiserror(&#039;raha otsas&#039;, 1, 1)\n     end\n     if exists(select saldo from kontod where id=@kuhu) begin\n        update kontod set saldo=saldo+@summa where id=@kuhu\n     end else begin\n        set @korras=0\n     end\nif @korras=1\n   commit transaction\nelse begin\n   rollback transaction\n   print &#039;probleem&#039;\nend\nselect * from kontod where id in (@kust, @kuhu)\n<\/pre><\/div>\n\n\n<p>Tahtes loodud protseduur k\u00e4ivitada, tuleb siis ette anda andjakonto, saajakonto ja \u00fclekantav summa. Ning juhul, kui \u00fclekanne on v\u00f5imalik, see ka tehakse.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nEXEC ylekanne 1, 4, 100\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Transaktsioonid on tegevused, kus k\u00f5ik tegevused kas \u00f5nnestuvad edukalt v\u00f5i ei \u00f5nnestu \u00fcldse. SQL Server tunnistab kahte t\u00fc\u00fcpi transaktsioone: Transaktsiooni tekitamiseks on k\u00e4sk BEGIN TRAN. Selle j\u00e4rele tulevad k\u00f5ik soovitud tegevused. Kui transaktsioon l\u00f5peb edukalt, siis saab selle l\u00f5petada k\u00e4suga COMMIT TRAN. Kui midagi l\u00e4heb valesti, saab selle tagasi kerida k\u00e4suga ROLLBACK TRAN. Vaatame n\u00e4iteks, &hellip; <a href=\"https:\/\/tarkvara.thkit.ee\/veeb\/transaktsioonid-transaction\/\" class=\"more-link\">Loe edasi <span class=\"screen-reader-text\">Transaktsioonid (Transaction)<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1057","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/1057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/comments?post=1057"}],"version-history":[{"count":16,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/1057\/revisions"}],"predecessor-version":[{"id":1074,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/1057\/revisions\/1074"}],"wp:attachment":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/media?parent=1057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}