欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL 事務autocommit自動提交操作

 更新時間:2021年01月18日 16:57:14   作者:瓊臺博客  
這篇文章主要介紹了MySQL 事務autocommit自動提交操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

MySQL默認操作模式就是autocommit自動提交模式。這就表示除非顯式地開始一個事務,否則每個查詢都被當做一個單獨的事務自動執(zhí)行。我們可以通過設置autocommit的值改變是否是自動提交autocommit模式。

通過以下命令可以查看當前autocommit模式

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.04 sec)

從查詢結果中,我們發(fā)現Value的值是ON,表示autocommit開啟。我們可以通過以下SQL語句改變這個模式

mysql> set autocommit = 0;

值0和OFF都是一樣的,當然,1也就表示ON。通過以上設置autocommit=0,則用戶將一直處于某個事務中,直到執(zhí)行一條commit提交或rollback語句才會結束當前事務重新開始一個新的事務。

舉個例子,張三給李四轉賬500元。那么在數據庫中應該是以下操作:

1,先查詢張三的賬戶余額是否足夠

2,張三的賬戶上減去500元

3,李四的賬戶上加上500元

以上三個步驟就可以放在一個事務中執(zhí)行提交,要么全部執(zhí)行要么全部不執(zhí)行,如果一切都OK就commit提交永久性更改數據;如果出錯則rollback回滾到更改前的狀態(tài)。利用事務處理就不會出現張三的錢少了李四的賬戶卻沒有增加500元或者張三的錢沒有減去李四的賬戶卻加了500元。

MySQL默認的存儲引擎是MyISAM,MyISAM存儲引擎不支持事務處理,所以改變autocommit沒有什么作用。但不會報錯,所以要使用事務處理的童鞋一定要確定你所操作的表示支持事務處理的,如InnoDB。如果不知道表的存儲引擎可以通過查看建表語句查看建表的時候有沒有指定事務類型的存儲引擎,如果沒有指定存儲引擎默認則是MyISAM不支持事務的存儲引擎。

當然,事務處理是為了保障表數據原子性、一致性、隔離性、持久性。

這些都是要消耗系統(tǒng)資源的,要謹慎選擇。

補充:MySQL的事務處理(Transation)和自動執(zhí)行(AutoCommit)與提交類型(Completion)

1、事務(transaction)

事務在計算機術語中是指訪問并可能更新數據庫中各種數據項的一個程序執(zhí)行單元(unit)。事務主要用于處理操作量大,復雜度高的數據。如果你要刪除一條主表信息,而主表有多個從表的時候,你需要有步驟地刪除明細后再刪除主表信息,這個過程極其容易出錯,那么這個時候就是用事務才處理是最合適的了。

2、事務(Transcation)的用法

事務開始(start transaction or begin)

提交(commit)

回滾(rollback)

3、MYSQL支持的引擎(InnoDB)

show engines;

4、自動執(zhí)行(AutoCommit)與提交類型(Completion)

使用事務有兩種方式,分別為隱式事務和顯式事務。隱式事務實際上就是自動提交,Oracle 默認不自動提交,需要手寫 COMMIT。在MySQL中,自動提交(autocommit)在支持事務(transaction)的引擎中,若autocommit=true,則不需要commit的情況下直接提交語句形成永久性修改,Mysql默認打開autocommit,也可以通過配置設置。

set autocommit=0;(AutoCommit Off)
set autocommit=1;(AutoCommit On)
set completion_type=0;(No Chain)
set completion_type=1;(Chain)
set completion_type=2;(Release)

也可以通過語句查詢當前配置

show variables like '%autocommit%';
show variables like '%completion%';

5、驗證例子

mysql> BEGIN;
 -> INSERT INTO test SELECT '關羽';
 -> COMMIT;
 -> BEGIN;
 -> INSERT INTO test SELECT '張飛';
 -> INSERT INTO test SELECT '張飛';
 -> ROLLBACK;
 -> SELECT * FROM test;
 -> //
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Records: 1 Duplicates: 0 Warnings: 0
ERROR 1062 (23000): Duplicate entry '張飛' for key 'PRIMARY'

mysql> select * from test;//

當前窗口結果:

新建窗口結果:

結論:由于test表中name的唯一性約束,看代碼的話,兩個"張飛"執(zhí)行后(無論有無觸發(fā)主鍵約束),實際由于第二個"張飛"觸發(fā)了唯一性約束異常,所以我認為事務會跳出,所以在當前連接中,test表中可以看到一個張飛,實際上第二個事務,并沒有提交成功。

接下來,我們試試正常提交的數據。

mysql> BEGIN;
 -> INSERT INTO test SELECT '關羽';
 -> COMMIT;
 -> BEGIN;
 -> INSERT INTO test SELECT '張飛';
 -> INSERT INTO test SELECT '劉備';
 -> ROLLBACK;
 -> //
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 1 row affected (0.03 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.04 sec)


mysql> select * from test;//

當前窗口結果:

新建窗口結果:

結論:對比這次的測試結果,所以我認為第一個測試,并沒有執(zhí)行rollback,而是跳出事務處理異常機制了。

因為mysql默認打開了autocommit,那么我想驗證下在無顯示事務的情況下(即無begin開頭),兩個"張飛"是如何自處的?

mysql> BEGIN;
 -> INSERT INTO test SELECT '關羽';
 -> COMMIT;
 -> INSERT INTO test SELECT '張飛';
 -> INSERT INTO test SELECT '張飛';
 -> ROLLBACK;
 -> //
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.02 sec)
Query OK, 1 row affected (0.05 sec)
Records: 1 Duplicates: 0 Warnings: 0

ERROR 1062 (23000): Duplicate entry '張飛' for key 'PRIMARY'
mysql> select *from test;//

當前窗口結果:

新建窗口結果:

結論:其實看執(zhí)行結果就知道了,第1個"張飛"作為單獨的事務已經執(zhí)行成功了,第二個"張飛"由于觸發(fā)了主鍵約束所以執(zhí)行失敗了。除了顯示事務外,有沒有辦法在沒結束事務前(無Commit)前,可以讓兩個"張飛"合并成一個事務呢?

可以設置set completion_type=1;(chain),也就是說無論幾個"張飛"在還沒提交之前,都是一個事務。

代碼與上面的一樣。

mysql> SET @@completion_type = 1;
 -> BEGIN;
 -> INSERT INTO test SELECT '關羽';
 -> COMMIT;
 -> INSERT INTO test SELECT '張飛';
 -> INSERT INTO test SELECT '張飛';
 -> ROLLBACK;
 -> //
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.02 sec)
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
ERROR 1062 (23000): Duplicate entry '張飛' for key 'PRIMARY'

當前窗口結果:

新建窗口結果:

結論:因為我設置了set completion_type=1(chain),相當與在第一個"張飛"前加了begin,所以第二個"張飛"由于觸發(fā)了主鍵約束所以導致事務失敗,插入數據失敗。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:

相關文章

  • MySQL連接池DataSource的使用及實踐

    MySQL連接池DataSource的使用及實踐

    DruidDataSource作為一款優(yōu)秀的數據庫連接池組件,不僅提供了高效的連接管理,還包含了豐富的監(jiān)控和診斷功能,本文主要介紹了MySQL連接池DataSource的使用及實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • mysql查看表結構的三種方法總結

    mysql查看表結構的三種方法總結

    這篇文章主要介紹了mysql查看表結構的三種方法總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • MySQL之多表查詢自連接方式

    MySQL之多表查詢自連接方式

    這篇文章主要介紹了MySQL之多表查詢自連接方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • MySQL服務器的啟動和關閉

    MySQL服務器的啟動和關閉

    作為MySQL管理員,一個普通的目標就是確保服務器盡可能地處于運行狀態(tài),使得客戶機能夠隨時訪問它。但是,有時最好關閉服務器(例如,如果正在進行數據庫的重定位,不希望服務器在該數據庫中更新表)。保持服務器運行和偶爾關閉它的需求關系不是本書所解 決的。但是我們至少可以討論如何使服務器啟動和停止,以便您具備進行這兩個操作的能力。
    2008-04-04
  • mysql 5.7.11 winx64.zip安裝配置方法圖文教程

    mysql 5.7.11 winx64.zip安裝配置方法圖文教程

    這篇文章主要為大家分享了mysql5.7.11安裝配置方法圖文教程,具有一定的參考價值,感興趣的朋友可以參考一下
    2017-02-02
  • Mysql 如何實現多張無關聯(lián)表查詢數據并分頁

    Mysql 如何實現多張無關聯(lián)表查詢數據并分頁

    這篇文章主要介紹了Mysql 實現多張無關聯(lián)表查詢數據并分頁的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • mysql中刪除數據的幾種方法(最新推薦)

    mysql中刪除數據的幾種方法(最新推薦)

    在MySQL數據庫中,刪除數據是一個常見的操作,它允許從表中移除不再需要的數據,在執(zhí)行刪除操作時,需要謹慎,以免誤刪重要數據,本文給大家介紹mysql中刪除數據的幾種方法,感興趣的朋友一起看看吧
    2023-11-11
  • 解決mysql刪除用戶 bug的問題

    解決mysql刪除用戶 bug的問題

    這篇文章主要介紹了解決mysql刪除用戶 bug的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • MySQL查詢緩存優(yōu)化示例詳析

    MySQL查詢緩存優(yōu)化示例詳析

    MySQL的優(yōu)化指的是一個很大的系統(tǒng),面試的時候我之前是從sql的語句優(yōu)化方面去說的,這種優(yōu)化也有作用,不過是從邏輯方面去優(yōu)化,下面這篇文章主要給大家介紹了關于MySQL查詢緩存優(yōu)化的相關資料,需要的朋友可以參考下
    2022-10-10
  • MySQL COUNT(*)性能原理詳解

    MySQL COUNT(*)性能原理詳解

    這篇文章主要介紹了MySQL COUNT(*)性能原理詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08

最新評論