深入理解MySQL事務特性與自動提交
又是比較偏基礎(chǔ)理論的一篇文章,不過這也是向 MySQL 更高水平進階的必經(jīng)之路。關(guān)于事務以及事務隔離機制,其實是所有關(guān)系型數(shù)據(jù)庫都有的問題,它是一套比較基礎(chǔ)的理論和工具。
事務特性
事務這個東西,想必不用我過多解釋大家也都清楚,這也是我們學習任何數(shù)據(jù)庫產(chǎn)品的必學知識。同時,對于事務來說,還有 ACID 四大特性,我們先來復習一下。
Atomicity 原子性,事務內(nèi)的操作,要么全成功,要么全失敗,失敗了就回滾,成功了就提交
Consistency 一致性,從一個一致性狀態(tài)變換到另一個一致性狀態(tài),比如有兩個人,帳號里一共有 100 塊,不管兩人怎么來回轉(zhuǎn)賬,最后的總和還是 100 塊
Isolation 隔離性,多個用戶同時操作數(shù)據(jù)時,一個用戶的操作不能被別的用戶影響
Durability 持久性,事務提交了,那么改變就是永久的
有了這四個特性的保證,我們就可以說事務是非常安全的操作。這個安全體現(xiàn)在什么地方呢?最典型的例子就是轉(zhuǎn)帳問題,A向B轉(zhuǎn)了100塊,首先我們扣除A帳戶里的錢,這時因為各種原因操作中斷了,B的帳戶沒有收到錢,這時候A少了100,B沒有增加,問題也就隨之產(chǎn)生了。事務,主要解決的就是這類問題。
事務的自動提交
既然這么好,我們需要給所有操作都使用事務嗎?其實默認情況下 MySQL 是開啟了自動事務提交的,你的每一個操作語句都會是一個事務。注意,是每一個,而不是多個語句在同一個事務中。
mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+
這個 autocommit 代表的就是自動提交事務,我們可以關(guān)閉它,如果關(guān)閉它的話,則每條語句后面我們都需要 commit 一下。現(xiàn)在我們開兩個命令行窗口,在第一個命令行窗口設(shè)置 autocommit 為 OFF 。
mysql> set session autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | OFF | +---------------+-------+
接著,修改一條數(shù)據(jù)。
mysql> update test_user set username='bbb' where id = 2200000; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
然后我們在另一個命令行窗口查看數(shù)據(jù),數(shù)據(jù)依然是原來的狀態(tài),用戶名沒有更改為 bbb 。這個時候,我們回到第一個命令行窗口,運行 commit 提交事務。此時,再回到另一個窗口查詢,就可以看到修改之后的數(shù)據(jù)了。
-- 客戶端2 mysql> select * from test_user where id = 2200000; +---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+ | id | username | password | salt | created_at | updated_at | status | gender | +---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+ | 2200000 | ebbf4060e7aa5d1099b8 | 741a7199e189eebba674736397fa49d727c11348 | 2067 | 2022-01-19 23:58:59 | 1630877171 | 4 | 1 | +---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+ -- 客戶端1 mysql> commit; Query OK, 0 rows affected (0.00 sec) -- 客戶端2 mysql> select * from test_user where id = 2200000; +---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+ | id | username | password | salt | created_at | updated_at | status | gender | +---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+ | 2200000 | bbb | 741a7199e189eebba674736397fa49d727c11348 | 2067 | 2022-01-19 23:58:59 | 1630877171 | 4 | 1 | +---------+----------------------+------------------------------------------+------+---------------------+------------+--------+--------+
好吧,正常情況下我們其實還是保持自動提交比較好,真正需要事務的時候,直接 BEGIN 開啟,然后根據(jù)情況使用 COMMIT 或 ROLLBACK 就好了。
總結(jié)
今天的內(nèi)容我們就是簡單地回顧一下基礎(chǔ),同時再演示了一下關(guān)閉 MySQL 中的事務自動提交的效果。相信大家并不過癮,為啥呢?鼎鼎大名的事務隔離機制沒講呀,別急,這個我們放到后面再說,下一回,我們先說說事務中可能出現(xiàn)的問題,也是非常出名的三個問題,那就是:臟讀、幻讀、不可重復讀的問題。
到此這篇關(guān)于深入理解MySQL事務特性與自動提交的文章就介紹到這了,更多相關(guān)MySQL事務特性與自動提交內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DataGrip連接Mysql并創(chuàng)建數(shù)據(jù)庫的方法實現(xiàn)
本文主要介紹了DataGrip連接Mysql并創(chuàng)建數(shù)據(jù)庫的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02mysql?復制行數(shù)據(jù)命令經(jīng)驗分享(Mysql?復制一條數(shù)據(jù))
有時候表里有一行已經(jīng)添加好的數(shù)據(jù),想要多復制幾百條用來測試比如要分頁測試等,需要多條數(shù)據(jù),但是有時候數(shù)據(jù)表字段太多了,有幾十個,一個一個手寫那是不可能的2023-09-09mySQL之關(guān)鍵字的執(zhí)行優(yōu)先級講解
這篇文章主要介紹了mySQL之關(guān)鍵字的執(zhí)行優(yōu)先級講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11MySQL count(*/column)查詢優(yōu)化的實現(xiàn)
count()是SQL中一個常用的聚合函數(shù),其被用來統(tǒng)計記錄的總數(shù),本文主要介紹了MySQL count(*/column)查詢優(yōu)化的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-09-09