首頁  >  文章  >  資料庫  >  MySQL關係型資料庫事務的ACID特性與實作方法

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

PHPz
PHPz轉載
2023-05-28 17:01:271679瀏覽

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中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除