<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Perl 的 MySQL 事務 > 原文: [http://zetcode.com/db/mysqlperl/trans/](http://zetcode.com/db/mysqlperl/trans/) 在本章中,我們將處理事務。 首先,我們提供一些基本定義。 然后,我們介紹 Perl 腳本,該腳本顯示如何在 Perl DBI 中處理事務。 我們還將討論自動提交模式,這對于理解事務是必不可少的。 ## 定義 事務是針對一個或多個數據庫中數據的數據庫操作的基本單位。 事務中所有 SQL 語句的影響可以全部提交給數據庫,也可以全部回滾。 在自動提交模式中,更改立即生效。 要處理事務,我們要么關閉自動提交模式,要么使用`begin_work()`方法啟動事務。 事務以`commit()`或`rollback()`方法結束。 MySQL 數據庫具有不同類型的存儲引擎。 最常見的是 MyISAM 和 InnoDB 引擎。 在數據安全性和數據庫速度之間需要權衡。 MyISAM 表的處理速度更快,并且不支持事務。 另一方面,InnoDB 表可以更安全地防止數據丟失。 他們支持事務。 它們處理較慢。 默認情況下,數據庫連接處于自動提交模式。 `AutoCommit`數據庫句柄屬性用于設置或讀取自動提交模式。 當`AutoCommit`打開時,對`begin_work()`的調用將`AutoCommit`關閉。 `commit()`和`rollback()`方法重新打開`AutoCommit`。 如果關閉`AutoCommit`屬性,然后再調用`begin_work()`方法,則會收到一條錯誤消息,提示我們已經在事務中。 ## 例子 現在,我們將有一些可用于事務處理的腳本。 ```perl #!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1, AutoCommit => 0 }, ) or die $DBI::errstr; $dbh->do("DROP TABLE IF EXISTS Friends"); $dbh->do("CREATE TABLE Friends(Id INTEGER PRIMARY KEY AUTO_INCREMENT, Name TEXT) ENGINE=InnoDB"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Tom')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Rebecca')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Jim')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Robert')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Julian')"); $dbh->disconnect(); ``` 我們創建一個`Friends`表,并嘗試用數據填充它。 但是,正如我們將看到的,數據不會被提交。 ```perl { RaiseError => 1, AutoCommit => 0 }, ``` 我們已經將`AutoCommit`參數設置為 0。更改不會自動提交。 而且沒有提交語句。 因此,更改不會寫入數據庫。 ```perl $dbh->do("CREATE TABLE Friends(Id INTEGER PRIMARY KEY AUTO_INCREMENT, Name TEXT) ENGINE=InnoDB"); ``` 這是創建`Friends`表的 SQL 語句。 我們已經指定了 InnoDB 引擎。 請注意,自 MySQL 5.5 起,默認引擎為 InnoDB。 在 MyISAM 表中,SQL 語句在執行后被提交。 MyISAM 表不支持事務。 ```perl $ ./noautocommit.pl mysql> SELECT * FROM Friends; Empty set (0.00 sec) ``` 表已創建,但數據未插入表中。 在第二個示例中,我們將使用`commit()`方法將數據寫入數據庫。 ```perl #!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1, AutoCommit => 0 }, ) or die $DBI::errstr; $dbh->do("DROP TABLE IF EXISTS Friends"); $dbh->do("CREATE TABLE Friends(Id INTEGER PRIMARY KEY AUTO_INCREMENT, Name TEXT) ENGINE=InnoDB"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Tom')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Rebecca')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Jim')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Robert')"); $dbh->do("INSERT INTO Friends(Name) VALUES ('Julian')"); $dbh->commit(); $dbh->disconnect(); ``` 當關閉自動提交模式時,每個語句都在事務內,直到我們調用`commit()`方法為止。 ```perl $dbh->commit(); ``` 所有更改都將寫入數據庫。 ```perl mysql> SELECT * FROM Friends; +----+---------+ | Id | Name | +----+---------+ | 1 | Tom | | 2 | Rebecca | | 3 | Jim | | 4 | Robert | | 5 | Julian | +----+---------+ 5 rows in set (0.00 sec) ``` 我們使用`sqlite3`命令行工具驗證是否已寫入更改。 當事務中存在錯誤時,將回滾事務,并且不會將任何更改提交到數據庫。 ```perl #!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1, AutoCommit => 0}, ) or die $DBI::errstr; $dbh->do("UPDATE Friends SET Name='Thomas' WHERE Id=1"); $dbh->do("UPDATE Friend SET Name='Bob' WHERE Id=4"); $dbh->commit(); $dbh->disconnect(); ``` 在代碼示例中,自動提交已關閉。 有兩個語句構成一個事務。 第二個 SQL 語句中有錯誤。 因此,該事務將回滾。 ```perl $dbh->do("UPDATE Friend SET Name='Bob' WHERE Id=4"); ``` 表名稱不正確。 數據庫中沒有`Friend`表。 ```perl $ ./rollingback.pl DBD::mysql::db do failed: Table 'mydb.Friend' doesn't exist at ./rollingback.pl line 14. DBD::mysql::db do failed: Table 'mydb.Friend' doesn't exist at ./rollingback.pl line 14. Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle dbname=mydb at ./rollingback.pl line 14. ``` 運行示例將顯示此錯誤消息。 事務回滾。 ```perl mysql> SELECT * FROM Friends; +----+---------+ | Id | Name | +----+---------+ | 1 | Tom | | 2 | Rebecca | | 3 | Jim | | 4 | Robert | | 5 | Julian | +----+---------+ 5 rows in set (0.00 sec) ``` 即使第一個`UPDATE`語句正確,在`Friends`表中也沒有發生任何變化。 正如我們在教程中已經提到的那樣,默認模式是自動提交。 在這種模式下,我們可以使用`begin_work()`方法開始新的事務,并使用`commit()`或`rollback()`完成它。 `begin_work()`方法將關閉自動提交,`commit()`和`rollback()`方法將重新打開自動提交。 ```perl #!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1, HandleError=>\&handle_error }, ) or die $DBI::errstr; $dbh->begin_work(); $dbh->do("UPDATE Friends SET Name='Thomas' WHERE Id=1"); $dbh->do("UPDATE Friend SET Name='Bob' WHERE Id=4"); $dbh->commit(); $dbh->do("INSERT INTO Friends(Name) VALUES('Ronald')"); $dbh->disconnect(); sub handle_error { my $error = shift; print "An error occurred in the script\n"; print "Message: $error\n"; return 1; } ``` 再次,我們有一個不正確的第二條 SQL 語句。 這次,我們沒有明確關閉自動提交。 ```perl { RaiseError => 1, HandleError=>\&handle_error }, ``` 我們將把錯誤處理委托給`handle_error()`子例程。 ```perl $dbh->begin_work(); ``` 使用`begin_work()`方法,我們開始一個新事務。 自動提交已關閉。 ```perl $dbh->do("UPDATE Friends SET Name='Thomas' WHERE Id=1"); $dbh->do("UPDATE Friend SET Name='Bob' WHERE Id=4"); ``` 這兩個語句構成一個事務。 第二個是不正確的。 ```perl sub handle_error { my $error = shift; print "An error occurred in the script\n"; print "Message: $error\n"; return 1; } ``` 當我們遇到錯誤時,將調用此子例程。 我們打印一條錯誤消息。 請注意,該腳本不會退出。 ```perl $dbh->do("INSERT INTO Friends(Name) VALUES('Ronald')"); ``` 事務已回滾,我們沒有退出腳本。 它繼續。 回滾后,自動提交已重新打開。 新行已添加到`Friends`表中。 ```perl $ ./rollingback2.pl An error occurred in the script Message: DBD::mysql::db do failed: Table 'mydb.Friend' doesn't exist ``` 我們可以從`handle_error()`子例程中看到我們的自定義錯誤消息。 ```perl mysql> SELECT * FROM Friends; +----+---------+ | Id | Name | +----+---------+ | 1 | Thomas | | 2 | Rebecca | | 3 | Jim | | 4 | Robert | | 5 | Julian | | 6 | Ronald | +----+---------+ 6 rows in set (0.00 sec) ``` 一個新朋友被插入了表。 在 MySQL Perl 教程的這一部分中,我們處理了事務。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看