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

相关文章

  • MySQL基于group_concat()函数合并多行数据

    MySQL基于group_concat()函数合并多行数据

    这篇文章主要介绍了MySQL基于group_concat()函数合并多行数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • MySQL如何用分隔符分隔字符串

    MySQL如何用分隔符分隔字符串

    这篇文章主要介绍了MySQL如何用分隔符分隔字符串,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Mysql使用函数json_extract处理Json类型数据的方法实例

    Mysql使用函数json_extract处理Json类型数据的方法实例

    在日常业务开发中通常mysql数据库中某个字段会需要存储json格式字符串,下面这篇文章主要给大家介绍了关于Mysql使用函数json_extract处理Json类型数据的相关资料,需要的朋友可以参考下
    2022-09-09
  • MySQL如何改变表的存储引擎方式

    MySQL如何改变表的存储引擎方式

    这篇文章主要介绍了MySQL如何改变表的存储引擎方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 解决远程连接MySQL报错:2003 - Can‘t connect to MySQL server on ‘X.X.X.X‘ (10060 “Unknown error“)问题

    解决远程连接MySQL报错:2003 - Can‘t connect to&nb

    这篇文章主要给大家介绍了解决远程连接MySQL报错:2003 - Can‘t connect to MySQL server on ‘X.X.X.X‘ (10060 “Unknown error“)问题的方案,文中有详细的解决步骤,需要的朋友可以参考下
    2023-09-09
  • MySQL replace函数替换字符串语句的用法

    MySQL replace函数替换字符串语句的用法

    MySQL replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法,希望对您学习MySQL replace函数方面能有所启迪。
    2010-12-12
  • mysql中like % %模糊查询的实现

    mysql中like % %模糊查询的实现

    这篇文章主要介绍了mysql中like % %模糊查询的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • MySQL逻辑备份into outfile

    MySQL逻辑备份into outfile

    这篇文章主要介绍了MySQL 备份之 into outfile,文章围绕主题展开详细内容介绍,具有一定的参考价值需要的小伙伴可以参考一下
    2022-05-05
  • MySQL主从库过滤复制配置教程

    MySQL主从库过滤复制配置教程

    搭建MySQL主从库过滤复制,备份指定数据库,有利于数据库的管理,本文主要介绍了MySQL主从库过滤复制配置教程,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Mysql中DATEDIFF函数的基础语法及练习案例

    Mysql中DATEDIFF函数的基础语法及练习案例

    Datediff函数,最大的作用就是计算日期差,能计算两个格式相同的日期之间的差值,下面这篇文章主要给大家介绍了关于Mysql中DATEDIFF函数的基础语法及练习案例 的相关资料,需要的朋友可以参考下
    2022-09-09

最新评论