Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL ACID特性

MySQL关系型数据库事务的ACID特性与实现

投稿:hqx

这篇文章主要介绍了MySQL关系型数据库事务的ACID特性与实现,ACID 是为保证事务transaction是正确可靠的,具备原子性、一致性、隔离性、持久性等特性

1. 事务的 ACID 特性详

ACID 是为保证事务(transaction)是正确可靠的,所必须具备的四个特性:

以 A 给 B 转账100元为例:

2. MySQL 事务的实现

MySQL事务是由 InnoDB 存储引擎实现的。

可以用如下的命令显式的开启事务:

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

另外,在自动提交(autocommit)模式下,我们执行的每一条 SQL 语句都是一条独立的事务;如果关闭了自动提交(autocommit)模式,则所有的 SQL 语句都在一个事务中,直到执行了 commit 或 rollback,该事务结束,同时开始了另外一个事务。

MySQL 事务的 ACID 特性靠如下机制实现:

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特性与实现的文章就介绍到这了,更多相关MySQL ACID特性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文