<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
資料庫事務( transaction)是存取並可能操作各種資料項的一個資料庫操作序列,這些操作要麼全部執行,要麼全部不執行,是一個不可分割的工作單位。事務由事務開始與事務結束之間執行的全部資料庫操作組成。——百度百科
比如,你有2條sql要執行,如果放到一個事務裡,要麼2個sql都執行成功,要麼都失敗。都執行成功了就提交事務,有一個失敗了就回滾,不存在一個成功一個失敗。
這是資料庫事務的核心所在。
比如現在A有800元,B有200元,A給B轉賬200元。完成此場景有2步,可以當做在一個事務裡:
1- A:800-200=600
2- B:200+200=400
那麼,這2個步驟只能都成功,或者都失敗。如果一個成功一個失敗了,那麼有一個人的錢就不對了。原子性就是表示不能只發生其中一個動作。
針對一個事務操作前與操作後的狀態一致。
比如現在A有800元,B有200元,2個人總計是1000元。那麼不管這2個人之間怎麼轉來轉去,總和一定還是1000元,錢不會憑空產生或消失。
對於任意已提交事務,系統必須保證該事務對資料庫的改變不被丟失,即使資料庫出現故障。
比如現在A有800元,B有200元,此時A要給B轉賬200,或有2種情況:
1. 事務還沒提交,這時候服務掛了或者斷電,那麼重啟資料庫後,資料狀態應該為:A有800元,B有200元
2. 事務已經提交,這時候服務掛了或者斷電,那麼重啟資料庫後,資料狀態應該為:A有600元,B有400元
可以看到,事務一旦提交,就會持久化到資料庫裡,不會因外界原因導致資料丟失。
事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的。
比如現在有2個事務同時進行,A和C同時在給B轉賬:
事務一:A有800元,B有200元,A給B轉賬200元
事務二:C有1000元,B有200元,C給B轉賬100元
這2個事務不會互相影響。隔離性就是針對多使用者同時操作的情況下,排除其他事務對本事務的影響。
資料庫的事務隔離級別有4個,強度從低到高依次為:Read uncommitted
、Read committed
、Repeatable read
、Serializable
,而隨著隔離級別的不同,會引發一些其他的問題。
一個事務讀取了另外一個事務未提交的資料,就是髒讀。
事務1: A給B轉賬500,但是事務未提交。
事務2: B檢視了賬戶,發現A轉過來500,本來只轉300過來就好,發現多轉了200,心裡美滋滋。。。
事務1: A及時發現多轉了200,修改了轉300,提交事務。
最終,B再次檢視賬戶的時候發現還是隻多了300塊,白高興一場,這種就是髒讀。當隔離級別設定為Read uncommitted
時可能會出現該情況。
若避開髒讀,可以設定隔離級別為Read committed
。
一個事務先後讀取同一條記錄,而事務在兩次讀取之間該資料被其它事務所修改,則兩次讀取的資料不同,這種就是不可重複讀。
事務1:B去買東西,卡里有500塊錢,消費100,還沒提交事務。
事務2:B的老婆把B的500塊錢轉出去了,已提交事務。
事務1:B此時提交事務,支付不了。再次讀取發現卡里沒錢支付。
當隔離級別設定為Read committed
,可以避免髒讀,但是可能會造成不可重複讀。
若避開不可重複讀,可以設定隔離級別為Repeatable read
。
一個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料,這種現象就稱為幻讀。
事務1:B的老婆檢視B的卡消費記錄,目前共消費了500元。
事務2:B此時剛在外面請朋友吃完飯,付款了100,事務已提交。
B的老婆決定把賬單列印出來,晚上跟B對賬,卻發現列印出來的消費為600元。她剛才明明看到是500,怎麼是600,難道是幻覺?
Mysql的預設隔離級別為Repeatable read
,可以避免不可重複讀,但是可能出現幻讀的情況。
如果要繼續解決幻讀,那麼可以將隔離級別設定為最高階的Serializable
,這時候事務都是按照順序執行的,髒讀、幻讀、不可重複度都可以避免,但是效能很差。
可以在mysql裡手動去執行事務提交的過程,輔助理解。現在來模擬一個轉賬的過程,A給B轉賬500。
先創造下測試條件,造庫、表、資料。
-- 建立庫 CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci; -- 使用庫 USE shop; -- 建立表 CREATE TABLE `account`( `id` INT(3) NOT NULL AUTO_INCREMENT, `name` VARCHAR(30) NOT NULL, `money` DECIMAL(9,2) NOT NULL, PRIMARY KEY (`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入資料 INSERT INTO account(`name`,`money`) VALUES ('A', 2000.00),('B', 10000.00)
上述sql都執行完即可,現在有2條測試資料。
接下來手動執行事務提交的過程。
SET autocommit = 0; -- 關閉自動提交,預設是開啟
執行sql。
START TRANSACTION -- 開啟一個事務
執行sql。
UPDATE account SET money=money - 500 WHERE `name` = 'A' -- A減去500 UPDATE account SET money=money - 500 WHERE `name` = 'B' -- B增加500
執行後,資料變更。A加了500,B少了500。
現在我不去提交,進行回滾。
ROLLBACK; -- 回滾
資料變回最開始的樣子。
重新執行2條sql,並且提交事務。
UPDATE `shop`.`account` SET `money`=`money` - 500 WHERE `name` = 'A'; -- A減去500 UPDATE `shop`.`account` SET `money`=`money` + 500 WHERE `name` = 'B'; -- B增加500 COMMIT; -- 提交事務
資料修改成功,此時再次執行回滾,資料已經不可逆了。
以上就是Mysql資料庫事務的髒讀幻讀及不可重複讀詳解的詳細內容,更多關於Mysql資料庫事務的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45