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

网友投稿 612 2023-07-06

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

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

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方法都有效,会影响性能。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:最新Navicat 15 for MySQL怎么破解
下一篇:MySQL超大表怎么快速删除
相关文章