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

 更新时间:2022年07月31日 09:14:05   投稿:hqx  
这篇文章主要介绍了MySQL关系型数据库事务的ACID特性与实现,ACID 是为保证事务transaction是正确可靠的,具备原子性、一致性、隔离性、持久性等特性

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

相关文章

  • 详解如何利用amoeba(变形虫)实现mysql数据库读写分离

    详解如何利用amoeba(变形虫)实现mysql数据库读写分离

    这篇文章主要介绍了详解如何利用amoeba(变形虫)实现mysql数据库读写分离,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Mac安装 mysql 数据库总结

    Mac安装 mysql 数据库总结

    本文给大家分享的是如何在Mac下安装mysql数据库的方法,总结的很全面,有需要的小伙伴可以参考下
    2016-04-04
  • mysql导入csv的4种报错的解决方法

    mysql导入csv的4种报错的解决方法

    这篇文章主要介绍了mysql导入csv的4种报错的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 图文详解MySQL中两表关联的连接表如何创建索引

    图文详解MySQL中两表关联的连接表如何创建索引

    这篇文章通过图文给大家介绍了关于MySQL中两表关联的连接表如何创建索引的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • MySQL和Redis的数据一致性问题

    MySQL和Redis的数据一致性问题

    这篇文章主要介绍了MySQL和Redis的数据一致性问题,下面文章围绕Redis大的相关资料展开详情,需要的小伙伴可以参考一下
    2022-04-04
  • MySQL慢查询日志中的Lock_time由来解析

    MySQL慢查询日志中的Lock_time由来解析

    这篇文章主要为大家介绍了慢查询日志中Lock_time的由来解析,以及Lock_time 包含哪些锁等待时间、以及是怎么计算得到的,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-06-06
  • SQL性能优化方法及性能测试

    SQL性能优化方法及性能测试

    这篇文章主要介绍了SQL性能优化方法及性能测试,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-05-05
  • MySql通过ip地址进行访问的方法

    MySql通过ip地址进行访问的方法

    这篇文章主要介绍了MySql通过ip地址进行访问的方法,首先要登录mysql,切换数据库然后授权,具体代码详情大家参考下本文
    2018-06-06
  • 浅谈MySQL触发器的原理以及使用

    浅谈MySQL触发器的原理以及使用

    这篇文章主要介绍了浅谈MySQL触发器的原理以及使用,触发器的执行不需要使用 CALL 语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被 MySQL自动调用,需要的朋友可以参考下
    2023-05-05
  • mysql中的load命令使用方法

    mysql中的load命令使用方法

    使用mysql 中的load 命令,可以将txt 文件中的内容加载到数据库表中
    2013-10-10

最新评论