<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Ruby 的 SQLite 事務 > 原文: [http://zetcode.com/db/sqliteruby/trans/](http://zetcode.com/db/sqliteruby/trans/) 在本章中,我們將處理事務。 首先,我們提供一些基本定義。 然后,我們提供 Ruby 腳本,這些腳本顯示了如何在 Ruby `sqlite3`模塊中使用事務。 我們還將討論自動提交模式,這對于理解事務是必不可少的。 ## 定義 事務是針對一個或多個數據庫中數據的數據庫操作的基本單位。 事務中所有 SQL 語句的影響可以全部提交給數據庫,也可以全部回滾。 在自動提交模式中,更改立即生效。 為了處理事務,我們使用`transaction`方法開始事務。 事務以`commit`或`rollback`方法結束。 默認情況下,數據庫連接處于自動提交模式。 請注意,默認模式取決于驅動程序。 在 SQLite Python 驅動程序中,默認情況下自動提交已關閉。 在 SQLite 中,除`SELECT`以外的任何命令都將啟動隱式事務。 同樣,在事務中,諸如`CREATE TABLE` ...,`VACUUM`和`PRAGMA`之類的命令將在執行之前提交先前的更改。 手動事務以`BEGIN TRANSACTION`語句開始,并以`COMMIT`或`ROLLBACK`語句結束。 SQLite 支持三種非標準事務級別:`DEFERRED`,`IMMEDIATE`和`EXCLUSIVE`。 ## 例子 現在,我們將有一些腳本可用于事務和自動提交模式。 ```ruby #!/usr/bin/ruby require 'sqlite3' begin db = SQLite3::Database.open "test.db" db.execute "DROP TABLE IF EXISTS Friends" db.execute "CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT)" db.execute "INSERT INTO Friends(Name) VALUES ('Tom')" db.execute "INSERT INTO Friends(Name) VALUES ('Rebecca')" db.execute "INSERT INTO Friends(Name) VALUES ('Jim')" db.execute "INSERT INTO Friends(Name) VALUES ('Robert')" db.execute "INSERT INTO Friends(Name) VALUES ('Julian')" rescue SQLite3::Exception => e puts "Exception occurred" puts e ensure db.close if db end ``` 我們創建一個`Friends`表并用數據填充它。 我們沒有明確啟動事務,也沒有調用`commit`或`rollback`方法。 但是數據已寫入表中。 這是因為默認的工作模式是自動提交。 在這種模式下,每個 SQL 語句立即生效。 ```ruby db.execute "DROP TABLE IF EXISTS Friends" db.execute "CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT)" ``` 如果`Friends`表已經存在,我們將其刪除。 然后,我們使用`CREATE TABLE`語句創建表。 ```ruby db.execute "INSERT INTO Friends(Name) VALUES ('Tom')" db.execute "INSERT INTO Friends(Name) VALUES ('Rebecca')" ... ``` 我們插入數據。 ```ruby $ ./autocommit.rb $ sqlite3 test.db SQLite version 3.7.7 2011-06-23 19:49:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> SELECT * FROM Friends; 1|Tom 2|Rebecca 3|Jim 4|Robert 5|Julian ``` 我們執行腳本并使用`sqlite3`命令行工具檢查表。 `Friends`表已成功創建。 在第二個示例中,我們將使用`transaction`方法啟動事務。 ```ruby #!/usr/bin/ruby require 'sqlite3' begin db = SQLite3::Database.open "test.db" db.transaction db.execute "DROP TABLE IF EXISTS Friends" db.execute "CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT)" db.execute "INSERT INTO Friends(Name) VALUES ('Tom')" db.execute "INSERT INTO Friends(Name) VALUES ('Rebecca')" db.execute "INSERT INTO Friends(Name) VALUES ('Jim')" db.execute "INSERT INTO Friends(Name) VALUES ('Robert')" db.execute "INSERT INTO Friends(Name) VALUES ('Julian')" db.execute "INSERT INTO Friends(Name) VALUES ('Michael')" db.commit rescue SQLite3::Exception => e puts "Exception occurred" puts e db.rollback ensure db.close if db end ``` 我們重新創建`Friends`表。 在`transaction`方法調用之后,每個語句都在事務內,直到我們調用`commit`方法為止。 我們要么保存所有更改,要么不保存任何內容。 這是事務背后的基本思想。 ```ruby db.transaction ``` `transaction`方法開始新的事務。 該方法采用可選的`mode`參數,我們可以在其中指定事務級別。 默認級別`DEFERRED`。 ```ruby db.commit ``` 所做的更改將寫入數據庫。 如果我們注釋了這一行,則更改將不會保存。 ```ruby db.rollback ``` 如果發生錯誤,我們將回滾更改。 ```ruby sqlite> SELECT * FROM Friends; 1|Tom 2|Rebecca 3|Jim 4|Robert 5|Julian 6|Michael ``` 我們使用`sqlite3`命令行工具驗證是否已寫入更改。 當事務中存在錯誤時,將回滾事務,并且不會將任何更改提交到數據庫。 ```ruby #!/usr/bin/ruby require 'sqlite3' begin db = SQLite3::Database.open "test.db" db.transaction db.execute "UPDATE Friends SET Name='Thomas' WHERE Id=1" db.execute "UPDATE Friend SET Name='Bob' WHERE Id=4" db.commit rescue SQLite3::Exception => e puts "Exception occurred" puts e db.rollback ensure db.close if db end ``` 在代碼示例中,我們要更改兩個名稱。 有兩個語句構成一個事務。 第二個 SQL 語句中有錯誤。 因此,該事務將回滾。 ```ruby db.execute "UPDATE Friend SET Name='Bob' WHERE Id=4" ``` 表名稱不正確。 數據庫中沒有`Friend`表。 ```ruby $ ./rollingback.rb Exception occurred no such table: Friend ``` 運行示例將顯示此錯誤消息。 事務回滾。 ```ruby sqlite> SELECT * FROM Friends; 1|Tom 2|Rebecca 3|Jim 4|Robert 5|Julian ``` 即使第一個`UPDATE`語句正確,`Friends`表也沒有更改。 我們將再次嘗試更改兩行,這次是在自動提交模式下。 ```ruby #!/usr/bin/ruby require 'sqlite3' begin db = SQLite3::Database.new "test.db" db.execute "UPDATE Friends SET Name='Thomas' WHERE Id=1" db.execute "UPDATE Friend SET Name='Bob' WHERE Id=4" rescue SQLite3::Exception => e puts "Exception occurred" puts e ensure db.close if db end ``` 我們嘗試更新`Friends`表中的兩個名稱,將`Tom`更改為`Thomas`并將`Robert`更改為`Bob`。 ```ruby db.execute "UPDATE Friends SET Name='Thomas' WHERE Id=1" db.execute "UPDATE Friend SET Name='Bob' WHERE Id=4" ``` `UPDATE`語句的第二個不正確。 ```ruby $ ./autocommit2.rb Exception occurred no such table: Friend ``` 我們收到與上一個示例相同的錯誤消息。 ```ruby sqlite> SELECT * FROM Friends; 1|Thomas 2|Rebecca 3|Jim 4|Robert 5|Julian ``` 但是這一次,第一個`UPDATE`語句被保存。 第二個不是。 在 SQLite Ruby 教程的這一部分中,我們處理了事務。
                  <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>

                              哎呀哎呀视频在线观看