MySql事務(wù)原理介紹及特性
1. 什么是事務(wù)
一個(gè)事務(wù)就是一個(gè)完整的業(yè)務(wù)邏輯。
什么是一個(gè)完整的業(yè)務(wù)邏輯?
假設(shè)轉(zhuǎn)賬,從A賬戶向B賬戶中轉(zhuǎn)賬10000.
將A賬戶的錢減去10000 ( update語(yǔ)句)
將B賬戶的錢加上10000 ( update語(yǔ)句)
這就是一個(gè)完整的業(yè)務(wù)邏輯。
以_上的操作是-一個(gè)最小的工作單元,要么同時(shí)成功,要么同時(shí)失敗,不可再分。
這兩個(gè)update語(yǔ)句要求必須同時(shí)成功或者同時(shí)失敗,這樣才能保證錢是正確的。
僅有 DML (insert、delete、update)才會(huì)有事務(wù)一說(shuō),其他語(yǔ)句與事務(wù)無(wú)關(guān)?。。?/p>
本質(zhì)上說(shuō),一個(gè)事務(wù)其實(shí)就是多條 DML 語(yǔ)句同時(shí)成功,或者同時(shí)失敗?。?!
2. 事務(wù)是如何做到同時(shí)成功失敗
InnoDB 存儲(chǔ)引擎:提供了一組用來(lái)記錄事務(wù)性活動(dòng)的日志文件
在事務(wù)的執(zhí)行的過(guò)程中,每一條 DML 的操作都會(huì)記錄到 “事務(wù)性活動(dòng)的日志文件” 中。
在事務(wù)的執(zhí)行過(guò)程中,我們可以提交事務(wù),也可以回滾事務(wù)。
提交事務(wù)?
清空事務(wù)性活動(dòng)的日志文件,將數(shù)據(jù)全部徹底持久化到數(shù)據(jù)庫(kù)表中。
提交事務(wù)標(biāo)志著,事務(wù)的結(jié)束。并且是一種全部成功的結(jié)束。
回滾事務(wù)?
將之前所有的 DML 操作全部撤銷,并且清空事務(wù)性活動(dòng)的日志文件。
回滾事務(wù)標(biāo)志著,事務(wù)的結(jié)束,并且是一種全部失敗的結(jié)束。
3. 如何提交回滾事務(wù)
提交事務(wù):commit;
回滾事務(wù):rollback;
事務(wù)對(duì)應(yīng)的英語(yǔ)單詞是:transaction
1. mysql 中默認(rèn)的事務(wù)行為是怎樣的
mysql 默認(rèn)情況下是支持自動(dòng)提交事務(wù)的。(自動(dòng)提交)
什么是自動(dòng)提交?
每執(zhí)行一次 DML 語(yǔ)句,則提交一次。
如何將 mysql 的自動(dòng)提交機(jī)制關(guān)閉呢?
mysql> start transaction;
2. 回滾事務(wù)
回滾只能回滾到上一次的提交點(diǎn)
mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> select * from dept_bak; Empty set (0.00 sec) mysql> insert into dept_bak values(10, 'abc', 'beijing'); Query OK, 1 row affected (0.00 sec) mysql> insert into dept_bak values(10, 'abc', 'beijing'); Query OK, 1 row affected (0.00 sec) mysql> select * from dept_bak; +--------+------+---------+ | deptno | name | loc | +--------+------+---------+ | 10 | abc | beijing | | 10 | abc | beijing | +--------+------+---------+ 2 rows in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from dept_bak; Empty set (0.00 sec)
3. 提交事務(wù)
mysql> select * from dept_bak; Empty set (0.00 sec) mysql> insert into dept_bak values(10, 'aaa', 'bbb'); Query OK, 1 row affected (0.01 sec) mysql> insert into dept_bak values(10, 'aaa', 'bbb'); Query OK, 1 row affected (0.00 sec) mysql> select * from dept_bak; +--------+------+------+ | deptno | name | loc | +--------+------+------+ | 10 | aaa | bbb | | 10 | aaa | bbb | +--------+------+------+ 2 rows in set (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from dept_bak; +--------+------+------+ | deptno | name | loc | +--------+------+------+ | 10 | aaa | bbb | | 10 | aaa | bbb | +--------+------+------+ 2 rows in set (0.00 sec)
4. 事務(wù)的4個(gè)特性
A:原子性
說(shuō)明事務(wù)是最小的工作單元。不可再分。
C:一致性
所有事務(wù)要求,在同一個(gè)事務(wù)當(dāng)中,所有操作必須同時(shí)成功,或同時(shí)失敗,以保證數(shù)據(jù)的一致性。
I:隔離性
A事務(wù)和B事務(wù)之間具有一定的隔離性。
D:持久性
事務(wù)最終結(jié)束的一個(gè)保障。事務(wù)提交,就相當(dāng)于將沒(méi)有保存到硬盤(pán)上的數(shù)據(jù)保存到硬盤(pán)上。
5. 事務(wù)的隔離性
事務(wù)隔離性的4個(gè)級(jí)別:
1. 讀未提交:read uncommitted
(最低隔離級(jí)別)
事務(wù) A 可以讀取到事務(wù) B 未提交的數(shù)據(jù)
存在的問(wèn)題:臟讀現(xiàn)象(Dirty Read)
2. 讀已提交:read committed
事務(wù) A 只能讀取到事務(wù) B 提交之后的數(shù)據(jù)
這種隔離級(jí)別解決了臟讀現(xiàn)象?。?!
存在的問(wèn)題:不可重復(fù)讀取數(shù)據(jù)。
不可讀取數(shù)據(jù):
在事務(wù)開(kāi)啟之后,第一次讀到的數(shù)據(jù)是3條,當(dāng)前事務(wù)還沒(méi)有結(jié)束,可能第二次再讀取的時(shí)候,讀到的數(shù)據(jù)是4條,3不等于4,稱為不可重復(fù)讀取。
3. 可重復(fù)讀:repeatble read
事務(wù) A 開(kāi)啟之后,不管是多久,每一次在事務(wù)A中讀取的數(shù)據(jù)都是一致的。即使事務(wù)B將數(shù)據(jù)已經(jīng)修改,并且提交了,事務(wù)A讀取到的數(shù)據(jù)還是沒(méi)有發(fā)生改變,這就是可重復(fù)讀。
該隔離級(jí)別解決了不可重復(fù)讀。
存在的問(wèn)題:幻影讀。
可重復(fù)讀,事務(wù)提交之后,只有事務(wù)不結(jié)束,讀到的數(shù)據(jù)永遠(yuǎn)都是事務(wù)剛開(kāi)始時(shí)的數(shù)據(jù)。
mysql 中默認(rèn)的事務(wù)隔離級(jí)別?。。。?/p>
4. 序列化/串行化:serializable
(最高隔離級(jí)別)
這是最高隔離級(jí)別,效率最低。解決了所有問(wèn)題。
這種隔離級(jí)別表示事務(wù)排隊(duì),不能并發(fā)!
每一次讀取到數(shù)據(jù)都是最真實(shí)的,并且效率是最低的。
到此這篇關(guān)于MySql事務(wù)原理介紹及特性的文章就介紹到這了,更多相關(guān)MySql事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL無(wú)法啟動(dòng)提示: Default storage engine (InnoDB) is not availabl
自己用的MYSQL都是用MYISAM數(shù)據(jù)庫(kù),還沒(méi)涉及到需要INNODB,因此打算直接不加載INNODB引擎。2011-05-05MySQL索引失效十種場(chǎng)景與優(yōu)化方案
這篇文章主要介紹了MySQL索引失效十種場(chǎng)景與優(yōu)化方案,文中有詳細(xì)的代碼示例供參考閱讀,感興趣的朋友可以看一下2023-05-05mysql如何將表結(jié)構(gòu)導(dǎo)出到excel
這篇文章主要介紹了mysql如何將表結(jié)構(gòu)導(dǎo)出到excel,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-09-09MySQL?如何將查詢結(jié)果導(dǎo)出到文件(select?…?into?Statement)
我們經(jīng)常會(huì)遇到需要將SQL查詢結(jié)果導(dǎo)出到文件,以便后續(xù)的傳輸或數(shù)據(jù)分析的場(chǎng)景,本文就MySQL中select…into的用法進(jìn)行演示,感興趣的朋友跟隨小編一起看看吧2024-08-08關(guān)于數(shù)據(jù)庫(kù)連接池Druid使用說(shuō)明
這篇文章主要介紹了關(guān)于數(shù)據(jù)庫(kù)連接池Druid使用說(shuō)明,涉及Druid 參數(shù)和運(yùn)行原理等等相關(guān)內(nèi)容,小編覺(jué)得挺不錯(cuò)的,在這里給大家分享一下。2017-10-10MySQL數(shù)據(jù)庫(kù)終端—常用操作指令代碼
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)終端—常用操作指令代碼,添加用戶、更改用戶名和host主機(jī)、更改密碼、刪除用戶等等,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-01-01