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特性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQL查询语句优化的实用方法总结

    SQL查询语句优化的实用方法总结

    下面小编就为大家带来一篇SQL查询语句优化的实用方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • mysql 10w级别的mysql数据插入

    mysql 10w级别的mysql数据插入

    几天前做了一个短信发送东东,一次性要插入10w以上的手机号码。我的个天啊。
    2011-08-08
  • MySQL数据库超时设置配置的方法实例

    MySQL数据库超时设置配置的方法实例

    这篇文章主要给大家介绍了关于MySQL数据库超时设置配置的相关资料,通过文中的设置方法可以很好的解决大家遇到的mysql数据库超时问题,需要的朋友可以参考下
    2021-10-10
  • MySQL备份与恢复之冷备(1)

    MySQL备份与恢复之冷备(1)

    这篇文章主要介绍了MySQL备份与恢复之冷备,冷备一般需要定制计划,比如什么时候做备份,每次对哪些数据进行备份等等,对冷备感兴趣的小伙伴们可以参考一下
    2015-08-08
  • mysql 数据库设计

    mysql 数据库设计

    大家都知道mysql的myisam表适合读操作大,写操作少;表级锁表
    2009-06-06
  • mysql8如何设置不区分大小写ubuntu20

    mysql8如何设置不区分大小写ubuntu20

    这篇文章主要介绍了mysql8如何设置不区分大小写ubuntu20问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • mysql性能优化脚本mysqltuner.pl使用介绍

    mysql性能优化脚本mysqltuner.pl使用介绍

    无意中发现了,major哥们开发的一个性能分析脚本,很有意思,可以通过这个脚本学学他的思想
    2013-02-02
  • Mysql获取当前日期的前几天日期的方法

    Mysql获取当前日期的前几天日期的方法

    这篇文章主要介绍了Mysql获取当前日期的前几天日期的方法,本文直接给出实现代码,需要的朋友可以参考下
    2015-03-03
  • MySQL每晚定时弹出一个taskeng.exe的解决方法

    MySQL每晚定时弹出一个taskeng.exe的解决方法

    这篇文章主要介绍了MySQL每晚定时弹出一个taskeng.exe的解决方法,需要的朋友可以参考下
    2018-07-07
  • MySQL中使用binlog时格式该如何选择

    MySQL中使用binlog时格式该如何选择

    这篇文章主要给大家介绍了关于MySQL中使用binlog时格式该如何选择的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论