您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL關系型數據庫事務的ACID特性與實現方法”,在日常操作中,相信很多人在MySQL關系型數據庫事務的ACID特性與實現方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL關系型數據庫事務的ACID特性與實現方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
ACID 是為保證事務(transaction)是正確可靠的,所必須具備的四個特性:
原子性(Atomicity):事務中的操作同時成功或者失敗。
一致性(Consistency):數據庫事務不能破壞數據的完整性以及業務邏輯上的一致。
隔離性(Isolation):一個事務不影響其他事務的運行效果。
持久性(Durability):事務完成后,事務所做的修改應該持久的保存在數據庫中,不會被回滾。
以 A 給 B 轉賬100元為例:
原子性:A 失去100元與 B 收到 100 元同時發生。
一致性:A 的賬戶在失去100元后不能為負數。
隔離性:A 賬戶在執行該事務的同時如果執行 B 事務失去1元,那么最終應為失去101元,兩者互不影響。
持久性:A 的賬戶失去100元后就不能要回來了。
MySQL事務是由 InnoDB 存儲引擎實現的。
可以用如下的命令顯式的開啟事務:
start transaction / (Begin); #一條或多條sql語句 Commit;
另外,在自動提交(autocommit)模式下,我們執行的每一條 SQL 語句都是一條獨立的事務;如果關閉了自動提交(autocommit)模式,則所有的 SQL 語句都在一個事務中,直到執行了 commit 或 rollback,該事務結束,同時開始了另外一個事務。
MySQL 事務的 ACID 特性靠如下機制實現:
原子性:undo log,邏輯日志,記錄 SQL 執行相關的信息。當發生回滾時,InnoDB 會根據 undo log 的內容做與之前相反的工作
持久性:redo log,當事務提交時,會調用fsync接口對redo log進行刷盤。
隔離性:鎖機制與 MVCC。
一致性:數據庫本身的設計。
Go 語言的 Gorm 提供了對于事務操作的支持:
db.Transaction(func(tx *gorm.DB) error { // 在事務中執行一些 db 操作(從這里開始,您應該使用 'tx' 而不是 'db') if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { // 返回任何錯誤都會回滾事務 return err } if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { return err } // 返回 nil 提交事務 return nil })
此外,還有嵌套事務以及手動事務等操作,可以參考中文文檔:Go GORM 事務詳細介紹
public class AClass { @Transactional(rollbackFor = Exception.class) public void aFunction() { //todo: 數據庫操作A(增,刪,該) } }
@Transactional 注解必須添加在public方法上,private、protected方法上是無效的。
一般情況下,推薦將@Transactional 注解加在方法上,因為@Transactional直接加在類或者接口上,@Transactional注解會對類或者接口里面所有的public方法都有效,會影響性能。
到此,關于“MySQL關系型數據庫事務的ACID特性與實現方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。