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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## 事務與鎖基礎 ### 事務的基礎 1. 事務即 **transaction**,是數據庫系統區別于文件系統的重要特性之一。 2. 在文件系統中,如果我們正在寫文件,但是操作系統崩潰了,那么文件中的數據可能會丟失。但是數據庫可以通過事務機制來確保這一點。 事務的必要性 ### 使用場景 > 在開發中經常有需要保持多個表數據一致的問題,我們會引入事務,比如假如有兩個用戶a,b,假設 a 要給 b 轉賬 1000 元,那么只需要在表中把 a 對應的記錄的相應字段減去 1000,給 b 對應的記錄的相應 字段增加 1000 即可。 但是當我們給 a 對應的記錄減去 1000,但是當執行給 b 對應的記錄增加 1000 的時候,服務器突然出現了一些問題,導致該 SQL 并未順利執行就宕機 了。 如果不啟用事務,那么結果就是 a 對應的記錄減少了 1000,但是 b 對應的記錄并沒有增加 1000,這是不符合常理的,于是,我們引入了事務機制來保證它的可靠性。 ### 事務的特性(ACID) 事務要求 **ACID** 的特性,即:**原子性、一致性、隔離性、持久性**。 1. **原子性**,是指整個數據庫的每個事務都是不可分割的單位。只有事務中的所有 SQL 語句都執行成功,才算整個事務成功,事務才會被提交。如果事務 中任何一個 SQL 語句執行失敗,整個事務都應該被回滾。 2. **一致性**,是指將數據庫從一種一致性狀態轉換為下一種一致性狀態。不允許數據庫中的數據出現新老數據都有的情況,要么都是老數據,要么都是新數 據。用更書面化的表達就是:數據的完整性約束沒有被破壞。 3. **隔離性**,是指一個事務的影響在該事務提交前對其他事務都不可見,它通過鎖機制來實現。 4. **持久性**,是指事務一旦被提交,其結果就是永久性的。即使發生宕機等故障,數據庫也能將數據恢復 ### 事務的語法 1. 在 MySQL 命令行的默認設置下,事務是自動提交的,即執行了SQL 語句之后會馬上執行 **commit **操作,我們可以設置 `set autocommit=0` 來禁用當前回話 的自動提交。 還可以用 `begin `、`start transaction` 來顯式的開始一個事務。 2. `commit `在默認設置下是等價于 `commit work `的,表示提交事務。 3. `rollback `在默認設置下等價于` rollback work`,表示事務回滾。 4. `savepoint xxx` 表示定義一個保存點,在一個事務中可以有多個保存點。 5. `release savepoint xxx` 表示刪除一個保存點,當沒有該保存點的時候執行該語句,會拋出一個異常。 6. `rollback to [savepoint] xxx` 表示回滾到某個保存點。 >這里簡單把上面的語法簡單過一遍 首先簡單建一個用戶user表,這里我們只是過一遍語法。 ``` SQL CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_name` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` ![](https://img.kancloud.cn/d6/f8/d6f84831a28839597ebf25a3893394fa_269x131.png) 我們先查詢一下事務的自動提交狀態 ``` SQL -- 查詢事務自動提交狀態 show variables like '%commit%'; ``` ![](https://img.kancloud.cn/7f/98/7f9813a41009bb253445a9a8a52530bc_279x264.png) 以下是事務自動提交修改方式: ``` SQL -- 全局修改 set global autocommit=0; show global variables like 'autocommit'; -- 局部修改 set session autocommit=0; show global variables like 'autocommit'; ``` 這里我貼一個曾經做過的測試,關于global和session的配置細節,因為這里是做事務相關的總結,他倆的測試我就不貼在上面了。 1. global全局參數的設置是對已經開啟的session不生效,但是對于新開啟的session才是有效的。 2. 雖然設置了全局變量,但是在mysql服務重啟之后,數據庫的配置又會重新初始化,一切按照my.ini的配置進行初始化。global和session的配置都會失效了。 接下來我們開啟兩個查詢窗口開始測試: ![](https://img.kancloud.cn/1a/65/1a657c4716eabdd2f1e9c3ab777fd87c_1013x611.png) 事務簡單操作:開啟兩個窗口,一個用于事務新增數據,一個用于事務提交前查詢 第一次,session1事務沒有提交,session2直接查詢數據 session1: ``` SQL -- 開啟事務 start transaction; insert into `user` (`user_name`,`password`)values('test','1'); ``` session2: ``` SQL select * from `user`; ```
                  <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>

                              哎呀哎呀视频在线观看