您现在的位置是:网站首页> 编程资料编程资料
MySQL关系型数据库事务的ACID特性与实现_Mysql_
2023-05-26
319人已围观
简介 MySQL关系型数据库事务的ACID特性与实现_Mysql_
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索引优化实例分析_Mysql_
- Mysql中使用count加条件统计的实现示例_Mysql_
- MySQL常用命令与内部组件及SQL优化详情_Mysql_
- Mysql中count(*)、count(1)、count(主键id)与count(字段)的区别_Mysql_
- Mysql中报错函数floor()函数和rand()函数的配合使用及原理详解_Mysql_
- 通过yum方式安装mySql数据库的全过程_Mysql_
- MySQL外键约束详解_Mysql_
- MySQL索引优化之不适合构建索引及索引失效的几种情况详解_Mysql_
- MySQL索引优化之适合构建索引的几种情况详解_Mysql_
- MySQL筑基篇之增删改查操作详解_Mysql_
