{"id":980,"date":"2010-07-12T08:04:42","date_gmt":"2010-07-12T00:04:42","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=980"},"modified":"2011-03-08T12:16:07","modified_gmt":"2011-03-08T04:16:07","slug":"como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/","title":{"rendered":"Como trabalhar com multiplas transa\u00e7\u00f5es utilizando dbExpress Framework"},"content":{"rendered":"<p>Ol\u00e1 pessoal, mais um post sobre dbExpress Framework, desta vez vamos focar em controle de transa\u00e7\u00f5es. \u00c9 comum termos situa\u00e7\u00f5es onde precisamos ter mais de uma transa\u00e7\u00e3o em uma mesma conex\u00e3o ao banco de dados, essa tarefa no dbExpress \u00e9 bem simples.<\/p>\n<p>O m\u00e9todo\u00a0TDBXConnection.BeginTransaction inicia uma transa\u00e7\u00e3o no banco de dados, o tipo desta transa\u00e7\u00e3o ir\u00e1 depender do par\u00e2metro a ser passado durante a cria\u00e7\u00e3o da transa\u00e7\u00e3o, estes tipos podem ser:<\/p>\n<ul>\n<li>TDBXIsolations.ReadCommitted<\/li>\n<li>TDBXIsolations.RepeatableRead<\/li>\n<li>TDBXIsolations.DirtyRead<\/li>\n<li>TDBXIsolations.Serializable<\/li>\n<li>TDBXIsolations.SnapShot<\/li>\n<\/ul>\n<p>Voc\u00ea pode consultar a documenta\u00e7\u00e3o do RAD Studio online e entender cada tipo de isolamente transacional <strong><a href=\"http:\/\/docwiki.embarcadero.com\/VCL\/en\/DBXCommon.TDBXIsolations\" target=\"_self\">aqui<\/a><\/strong>. Importante lembrar que o isolamento transacional ir\u00e1 variar de banco para banco, verifica quais o seu banco de dados suporta.<\/p>\n<p>Ao iniciar uma transa\u00e7\u00e3o o m\u00e9todo BeginTransaction retornar\u00e1 um objeto do tipo TDBXTransaction onde voc\u00ea poder\u00e1 efetuar o Commit e Rollback da transa\u00e7\u00e3o.<\/p>\n<p>No exemplo abaixo temos duas transa\u00e7\u00f5es onde atrav\u00e9s de uma efetuamos 5 inserts, o resultado da query mostra que os registros est\u00e3o no banco de dados e n\u00e3o comitados ainda, a partir dai iniciamos outra transa\u00e7\u00e3o com o n\u00edvel de isolamento ReadCommited, que quer dizer trazer todos os registrados que estejam efetivamente &#8220;comitados&#8221; no banco, como ainda n\u00e3o fizemos o commit, o resultados do select vir\u00e1 fazio, ao final efetuamos o Rollback para que os registros n\u00e3o sejam efetivamente gravados na base de dados e depois efetuamos um commit na transa\u00e7\u00e3o de consulta.<\/p>\n<p>O c\u00f3digo ficaria assim:<\/p>\n<pre class=\"brush: delphi\">program MultipleTransaction;\r\n{$APPTYPE CONSOLE}\r\n\r\nuses\r\n  SysUtils,\r\n  DBXDynalink,\r\n  DBXCommon,\r\n  DBXInterbase;\r\n\r\nConst\r\n  InsertSQL : String = 'Insert Into Country Values ( ''%s'', ''%s'' )';\r\n\r\nvar\r\n  ConnName: string;\r\n  Conn: TDBXConnection;\r\n  TransSelect,\r\n  TransInsert  : TDBXTransaction;\r\n  Cmd: TDBXCommand;\r\n  Reader: TDBXReader;\r\n  i : integer;\r\n\r\nbegin\r\n\r\n  Conn := TDBXConnectionFactory.GetConnectionFactory.GetConnection\r\n    ('employee ib', 'sysdba', 'masterkey');\r\n\r\n  if Conn &lt;&gt; nil then\r\n  begin\r\n\r\n    Cmd := Conn.CreateCommand;\r\n\r\n    \/\/ Start transaction - only inserts\r\n    TransInsert := Conn.BeginTransaction(TDBXIsolations.ReadCommitted);\r\n\r\n    for I := 1 to 5 do\r\n    begin\r\n      Cmd.Text := Format(InsertSQL, [ 'Record ' + IntToStr(I), IntToStr(I)]);\r\n      Cmd.Prepare;\r\n      Cmd.ExecuteUpdate;\r\n    end;\r\n\r\n    \/\/ Prepare and execute the SQL Statement\r\n    Cmd.Text := 'SELECT * FROM Country Where Country Like ''Rec%''';\r\n    Cmd.Prepare;\r\n\r\n    Reader := Cmd.ExecuteQuery;\r\n\r\n    Writeln('========== First Select including the new 5 records');\r\n    while Reader.Next do\r\n      Writeln(Reader.Value['Country'].GetAnsiString);\r\n\r\n    \/\/ Start new transaction - doesn't include the inserted record\r\n    TransSelect := Conn.BeginTransaction(TDBXIsolations.DirtyRead);\r\n\r\n    Writeln('====================================================');\r\n    Writeln('');\r\n\r\n    Reader := Cmd.ExecuteQuery;\r\n\r\n    Writeln('========== Second Select based on new transaction');\r\n    while Reader.Next do\r\n      Writeln(Reader.Value['Country'].GetAnsiString);\r\n\r\n    \/\/ Commit Select transaction and Rollback the Insert transaction\r\n    Conn.CommitFreeAndNil(TransSelect);\r\n    Conn.RollbackFreeAndNil(TransInsert);\r\n\r\n    Readln;\r\n    Reader.Free;\r\n    Cmd.Free;\r\n    Conn.Free;\r\n\r\n  end;\r\n\r\nend.<\/pre>\n<p>Ao executar o c\u00f3digo acima, temos o seguinte resultado:<\/p>\n<p><a href=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/07\/DBXCmdResult.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-981\" title=\"dbExpress result\" src=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/07\/DBXCmdResult.jpg\" alt=\"\" width=\"677\" height=\"340\" srcset=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/07\/DBXCmdResult.jpg 677w, http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/07\/DBXCmdResult-320x160.jpg 320w, http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/07\/DBXCmdResult-450x225.jpg 450w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 pessoal, mais um post sobre dbExpress Framework, desta vez vamos focar em controle de transa\u00e7\u00f5es. \u00c9 comum termos situa\u00e7\u00f5es onde precisamos ter mais de uma transa\u00e7\u00e3o em uma mesma conex\u00e3o ao banco de dados, essa tarefa no dbExpress \u00e9 bem simples. O m\u00e9todo\u00a0TDBXConnection.BeginTransaction inicia uma transa\u00e7\u00e3o no banco de dados, o tipo desta transa\u00e7\u00e3o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"","footnotes":""},"categories":[102],"tags":[33,181],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Como trabalhar com multiplas transa\u00e7\u00f5es utilizando dbExpress Framework | Andreano Lanusse | Tecnologia e Desenvolvimento de Software<\/title>\n<meta name=\"description\" content=\"Ol\u00e1 pessoal, mais um post sobre dbExpress Framework, desta vez vamos focar em controle de transa\u00e7\u00f5es. \u00c9 comum termos situa\u00e7\u00f5es onde precisamos ter mais de\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como trabalhar com multiplas transa\u00e7\u00f5es utilizando dbExpress Framework | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"og:description\" content=\"Ol\u00e1 pessoal, mais um post sobre dbExpress Framework, desta vez vamos focar em controle de transa\u00e7\u00f5es. \u00c9 comum termos situa\u00e7\u00f5es onde precisamos ter mais de\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2010-07-12T00:04:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2011-03-08T04:16:07+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/07\/DBXCmdResult.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:site\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\">\n\t<meta name=\"twitter:data1\" content=\"2 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"description\":\"Andreano Lanusse blog - artigos, tutoriais e v&iacute;deos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e t&eacute;cnicas de programa&ccedil;&atilde;o\",\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/www.andreanolanusse.com\/pt\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/07\/DBXCmdResult.jpg\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/07\/DBXCmdResult.jpg\",\"width\":677,\"height\":340},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/\",\"name\":\"Como trabalhar com multiplas transa\\u00e7\\u00f5es utilizando dbExpress Framework | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#primaryimage\"},\"datePublished\":\"2010-07-12T00:04:42+00:00\",\"dateModified\":\"2011-03-08T04:16:07+00:00\",\"description\":\"Ol\\u00e1 pessoal, mais um post sobre dbExpress Framework, desta vez vamos focar em controle de transa\\u00e7\\u00f5es. \\u00c9 comum termos situa\\u00e7\\u00f5es onde precisamos ter mais de\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"Como trabalhar com multiplas transa\\u00e7\\u00f5es utilizando dbExpress Framework\",\"datePublished\":\"2010-07-12T00:04:42+00:00\",\"dateModified\":\"2011-03-08T04:16:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#webpage\"},\"commentCount\":18,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#primaryimage\"},\"keywords\":[\"dbExpress\",\"Delphi\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/como-trabalhar-com-multiplas-transacoes-utilizando-dbexpress-framework\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\"},\"sameAs\":[\"https:\/\/twitter.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/980"}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/comments?post=980"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/980\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media?parent=980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=980"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}