ホームページ  >  記事  >  データベース  >  MySQLリレーショナルデータベーストランザクションのACIDの特徴と実装方法

MySQLリレーショナルデータベーストランザクションのACIDの特徴と実装方法

PHPz
PHPz転載
2023-05-28 17:01:271674ブラウズ

1. トランザクションの詳細な ACID 特性

ACID は、トランザクションが正確で信頼できることを保証するために所有する必要がある 4 つの特性です:

  • 原子性: トランザクション内の操作は、同時に成功するか失敗します。

  • 一貫性: データベース トランザクションは、データの整合性やビジネス ロジックの一貫性を破壊することはできません。

  • 分離: トランザクションは他のトランザクションの操作に影響を与えません。

  • 耐久性 (耐久性): トランザクションの完了後、トランザクションによって行われた変更はデータベースに永続的に保存され、ロールバックされません。

A が 100 元を B に送金する例を考えます:

  • 原子性: A Bが100元を受け取ると同時に、100元の損失が発生します。

  • 一貫性: A の口座は、100 元を失った後にマイナスになることはありません。

  • 分離: アカウント A がこのトランザクションの実行中にトランザクション B の実行によって 1 元を失った場合、最終的な損失は 101 元となり、この 2 つは影響しません。お互いに。

  • しつこく: A の口座は 100 元を失った後、取り戻すことができません。

2. MySQL トランザクションの実装

MySQL トランザクションは、InnoDB ストレージ エンジンによって実装されます。

次のコマンドを使用してトランザクションを明示的に開始できます:

start transaction / (Begin);
#一条或多条sql语句
Commit;

さらに、自動送信 (自動コミット) モードでは、実行されるすべての SQLステートメントは独立したトランザクションです。自動コミット モードがオフになっている場合、コミットまたはロールバックが実行され、トランザクションが終了して別のトランザクションが開始されるまで、すべての SQL ステートメントは 1 つのトランザクション内にあります。

MySQL トランザクションの ACID 特性は、次のメカニズムによって実現されます:

  • 原子性: undo ログ、論理ログ、SQL 実行関連の情報を記録します。ロールバックが発生すると、InnoDB は、トランザクションがコミットされたときに、Undo ログ

  • 永続性: redo ログの内容に基づいて、前の作業の逆を実行します。が呼び出されます。 fsync インターフェイスは REDO ログをフラッシュします。

  • 分離: ロック メカニズムと 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 アノテーションは、クラス内のすべてのパブリック メソッドまたはインターフェイスに対して有効になります。インターフェイスはパフォーマンスに影響します。

以上がMySQLリレーショナルデータベーストランザクションのACIDの特徴と実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。