MySQL關(guān)系型數(shù)據(jù)庫(kù)事務(wù)的ACID特性與實(shí)現(xiàn)
1. 事務(wù)的 ACID 特性詳
ACID 是為保證事務(wù)(transaction)是正確可靠的,所必須具備的四個(gè)特性:
- 原子性(Atomicity):事務(wù)中的操作同時(shí)成功或者失敗。
- 一致性(Consistency):數(shù)據(jù)庫(kù)事務(wù)不能破壞數(shù)據(jù)的完整性以及業(yè)務(wù)邏輯上的一致。
- 隔離性(Isolation):一個(gè)事務(wù)不影響其他事務(wù)的運(yùn)行效果。
- 持久性(Durability):事務(wù)完成后,事務(wù)所做的修改應(yīng)該持久的保存在數(shù)據(jù)庫(kù)中,不會(huì)被回滾。
以 A 給 B 轉(zhuǎn)賬100元為例:
- 原子性:A 失去100元與 B 收到 100 元同時(shí)發(fā)生。
- 一致性:A 的賬戶在失去100元后不能為負(fù)數(shù)。
- 隔離性:A 賬戶在執(zhí)行該事務(wù)的同時(shí)如果執(zhí)行 B 事務(wù)失去1元,那么最終應(yīng)為失去101元,兩者互不影響。
- 持久性:A 的賬戶失去100元后就不能要回來(lái)了。
2. MySQL 事務(wù)的實(shí)現(xiàn)
MySQL事務(wù)是由 InnoDB 存儲(chǔ)引擎實(shí)現(xiàn)的。
可以用如下的命令顯式的開(kāi)啟事務(wù):
start transaction / (Begin); #一條或多條sql語(yǔ)句 Commit;
另外,在自動(dòng)提交(autocommit)模式下,我們執(zhí)行的每一條 SQL 語(yǔ)句都是一條獨(dú)立的事務(wù);如果關(guān)閉了自動(dòng)提交(autocommit)模式,則所有的 SQL 語(yǔ)句都在一個(gè)事務(wù)中,直到執(zhí)行了 commit 或 rollback,該事務(wù)結(jié)束,同時(shí)開(kāi)始了另外一個(gè)事務(wù)。
MySQL 事務(wù)的 ACID 特性靠如下機(jī)制實(shí)現(xiàn):
- 原子性:undo log,邏輯日志,記錄 SQL 執(zhí)行相關(guān)的信息。當(dāng)發(fā)生回滾時(shí),InnoDB 會(huì)根據(jù) undo log 的內(nèi)容做與之前相反的工作
- 持久性:redo log,當(dāng)事務(wù)提交時(shí),會(huì)調(diào)用fsync接口對(duì)redo log進(jìn)行刷盤。
- 隔離性:鎖機(jī)制與 MVCC。
- 一致性:數(shù)據(jù)庫(kù)本身的設(shè)計(jì)。
3. Gorm 事務(wù)的使用
Go 語(yǔ)言的 Gorm 提供了對(duì)于事務(wù)操作的支持:
db.Transaction(func(tx *gorm.DB) error { // 在事務(wù)中執(zhí)行一些 db 操作(從這里開(kāi)始,您應(yīng)該使用 'tx' 而不是 'db') if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { // 返回任何錯(cuò)誤都會(huì)回滾事務(wù) return err } if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { return err } // 返回 nil 提交事務(wù) return nil })
此外,還有嵌套事務(wù)以及手動(dòng)事務(wù)等操作,可以參考中文文檔:Go GORM 事務(wù)詳細(xì)介紹
4. Spring 事務(wù)的使用
public class AClass { @Transactional(rollbackFor = Exception.class) public void aFunction() { //todo: 數(shù)據(jù)庫(kù)操作A(增,刪,該) } }
@Transactional 注解必須添加在public方法上,private、protected方法上是無(wú)效的。
一般情況下,推薦將@Transactional 注解加在方法上,因?yàn)锧Transactional直接加在類或者接口上,@Transactional注解會(huì)對(duì)類或者接口里面所有的public方法都有效,會(huì)影響性能。
到此這篇關(guān)于MySQL關(guān)系型數(shù)據(jù)庫(kù)事務(wù)的ACID特性與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL ACID特性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù)
這篇文章主要介紹了MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Mysql使用函數(shù)json_extract處理Json類型數(shù)據(jù)的方法實(shí)例
在日常業(yè)務(wù)開(kāi)發(fā)中通常mysql數(shù)據(jù)庫(kù)中某個(gè)字段會(huì)需要存儲(chǔ)json格式字符串,下面這篇文章主要給大家介紹了關(guān)于Mysql使用函數(shù)json_extract處理Json類型數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-09-09解決遠(yuǎn)程連接MySQL報(bào)錯(cuò):2003 - Can‘t connect to&nb
這篇文章主要給大家介紹了解決遠(yuǎn)程連接MySQL報(bào)錯(cuò):2003 - Can‘t connect to MySQL server on ‘X.X.X.X‘ (10060 “Unknown error“)問(wèn)題的方案,文中有詳細(xì)的解決步驟,需要的朋友可以參考下2023-09-09MySQL replace函數(shù)替換字符串語(yǔ)句的用法
MySQL replace函數(shù)我們經(jīng)常用到,下面就為您詳細(xì)介紹MySQL replace函數(shù)的用法,希望對(duì)您學(xué)習(xí)MySQL replace函數(shù)方面能有所啟迪。2010-12-12mysql中l(wèi)ike % %模糊查詢的實(shí)現(xiàn)
這篇文章主要介紹了mysql中l(wèi)ike % %模糊查詢的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Mysql中DATEDIFF函數(shù)的基礎(chǔ)語(yǔ)法及練習(xí)案例
Datediff函數(shù),最大的作用就是計(jì)算日期差,能計(jì)算兩個(gè)格式相同的日期之間的差值,下面這篇文章主要給大家介紹了關(guān)于Mysql中DATEDIFF函數(shù)的基礎(chǔ)語(yǔ)法及練習(xí)案例?的相關(guān)資料,需要的朋友可以參考下2022-09-09