目錄
1. 事務的ACID 特性詳
首頁 資料庫 mysql教程 MySQL關係型資料庫事務的ACID特性與實作方法

MySQL關係型資料庫事務的ACID特性與實作方法

May 28, 2023 pm 05:01 PM
mysql 資料庫 acid

1. 事務的ACID 特性詳

ACID 是為保證事務(transaction)是正確可靠的,所必須具備的四個特性:

  • 原子性(Atomicity):事務中的操作同時成功或失敗。

  • 一致性(Consistency):資料庫交易不能破壞資料的完整性以及業務邏輯上的一致。

  • 隔離性(Isolation):一個交易不影響其他交易的運作效果。

  • 持久性(Durability):交易完成後,事務所所做的修改應該持久的保存在資料庫中,不會被回滾。

以A 給B 轉帳100元為例:

  • ##原子性:A失去100元與B 收到100 元同時發生。

  • 一致性:A 的帳戶在失去100元後不能為負數。

  • 隔離性:A 帳戶在執行該交易的同時如果執行B 交易失去1元,那麼最終應為失去101元,兩者互不影響。

  • 持久度:A 的帳號失去100元後就不能要回來了。

2. MySQL 事務的實作

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。

  • 一致性:資料庫本身的設計。

3. Gorm 事務的使用

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 事務詳細介紹

#4. Spring 事務的使用

public class AClass {

    @Transactional(rollbackFor = Exception.class)
    public void aFunction() {
        //todo: 数据库操作A(增,删,该)
    }
}
@Transactional 註解必須加入在public方法上,private、protected方法上是無效的。

一般情況下,推薦將@Transactional 註解加在方法上,因為@Transactional直接加在類別或介面上,@Transactional註解會對類別或介面裡面所有的public方法都有效,會影響效能。

以上是MySQL關係型資料庫事務的ACID特性與實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1604
29
PHP教程
1510
276
如何在Laravel中播種數據庫? 如何在Laravel中播種數據庫? Jul 28, 2025 am 04:23 AM

創建seeder文件:使用phpartisanmake:seederUserSeeder生成seeder類,並在run方法中通過模型工廠或數據庫查詢插入數據;2.在DatabaseSeeder中調用其他seeder:通過$this->call()按順序註冊UserSeeder、PostSeeder等,確保依賴關係正確;3.運行seeder:執行phpartisandb:seed運行所有註冊的seeder,或使用phpartisanmigrate:fresh--seed重置並重新填充數據;4

用對象級特權確保MySQL 用對象級特權確保MySQL Jul 29, 2025 am 01:34 AM

TosecureMySQLeffectively,useobject-levelprivilegestolimituseraccessbasedontheirspecificneeds.Beginbyunderstandingthatobject-levelprivilegesapplytodatabases,tables,orcolumns,offeringfinercontrolthanglobalprivileges.Next,applytheprincipleofleastprivile

管理大型MySQL表的最佳實踐 管理大型MySQL表的最佳實踐 Aug 05, 2025 am 03:55 AM

處理大表時,MySQL性能和可維護性面臨挑戰,需從結構設計、索引優化、分錶策略等方面入手。 1.合理設計主鍵和索引:推薦使用自增整數作為主鍵以減少頁分裂;使用覆蓋索引提升查詢效率;定期分析慢查詢日誌並刪除無效索引。 2.分區表的合理使用:按時間範圍等策略分區,提升查詢和維護效率,但需注意分區裁剪問題。 3.考慮讀寫分離和分庫分錶:讀寫分離緩解主庫壓力,分庫分錶適用於數據量極大場景,建議使用中間件並評估事務和跨庫查詢問題。前期規劃和持續優化是關鍵。

優化內容管理系統(CMS)的MySQL 優化內容管理系統(CMS)的MySQL Jul 28, 2025 am 03:19 AM

ToimproveMySQLperformanceforCMSplatformslikeWordPress,firstimplementacachinglayerusingpluginslikeRedisorMemcached,enableMySQLquerycaching(ifapplicable),andusepagecachingpluginstoservestaticfiles.Second,optimizeMySQLconfigurationbyincreasinginnodb_buf

實施MySQL數據庫複製過濾器 實施MySQL數據庫複製過濾器 Jul 28, 2025 am 02:36 AM

MySQL複製過濾可在主庫或從庫端配置,主庫端通過binlog-do-db或binlog-ignore-db控制binlog生成,適用於減少日誌體積;從庫端通過replicate-do-db、replicate-ignore-db、replicate-do-table、replicate-ignore-table及通配符規則replicate-wild-do-table和replicate-wild-ignore-table控制數據應用,更靈活且利於數據恢復;配置時需注意規則順序、跨庫語句行為、

MySQL中的截斷,刪除和掉落有什麼區別? MySQL中的截斷,刪除和掉落有什麼區別? Aug 05, 2025 am 09:39 AM

DELETEremovesspecificorallrows,keepstablestructure,allowsrollbackandtriggers,anddoesnotresetauto-increment;2.TRUNCATEquicklyremovesallrows,resetsauto-increment,cannotberolledbackinmostcases,doesnotfiretriggers,andkeepstablestructure;3.DROPremovesthee

如何故障排除常見的mySQL連接錯誤? 如何故障排除常見的mySQL連接錯誤? Aug 08, 2025 am 06:44 AM

檢查MySQL服務是否運行,使用sudosystemctlstatusmysql確認並啟動;2.確保bind-address設置為0.0.0.0以允許遠程連接,並重啟服務;3.驗證3306端口是否開放,通過netstat檢查並配置防火牆規則允許該端口;4.對於“Accessdenied”錯誤,需核對用戶名、密碼和主機名,登錄MySQL後查詢mysql.user表確認權限,必要時創建或更新用戶並授權,如使用'your_user'@'%';5.若因caching_sha2_password導致認證失

如何使用檢查約束來在MySQL中執行數據規則? 如何使用檢查約束來在MySQL中執行數據規則? Aug 06, 2025 pm 04:49 PM

MySQL支持CHECK約束以強制域完整性,自8.0.16版本起生效;1.創建表時添加約束:使用CREATETABLE定義CHECK條件,如年齡≥18、薪資>0、部門限定值;2.修改表添加約束:用ALTERTABLEADDCONSTRAINT限製字段值,如姓名非空;3.使用複雜條件:支持多列邏輯和表達式,如結束日期≥開始日期且完成狀態需有結束日期;4.刪除約束:通過ALTERTABLEDROPCONSTRAINT指定名稱刪除;5.注意事項:需MySQL8.0.16 、InnoDB或MyISAM引

See all articles