MySQL关系型数据库事务的ACID特性与实现方法
这篇文章主要介绍“MySQL关系型数据库事务的ACID特性与实现方法”,在日常操作中,相信很多人在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方法都有效,会影响性能。
到此,关于“MySQL关系型数据库事务的ACID特性与实现方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注蜗牛博客网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论