MySQL关系型数据库事务的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、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 MySQL关系型数据库事务的ACID特性与实现
相关文章
- 基于 Docker 搭建 MySQL 一主两从复制
- SqlServer Mysql数据库修改自增列的值及相应问题的解决方案
- 解决MySQL未提交的事务问题(mysql未提交事务)
- MySQL与微软携手共同开发数据库新时代(mysql微软)
- 一闪MySQL 一闪一闪亮晶晶:灯火阑珊处的数据库精彩(mysql一闪)
- MySQL中使用日期值进行相等比较(mysql日期相等)
- MySQL修改字段注释:简单指南(mysql修改字段注释)
- MySQL多用户同时访问:有效利用多核处理能力(mysql多人访问)
- 类型MySQL:了解二进制数据类型(mysql二进制数据)
- 实现数据管理:MySQL如何加载数据库数据(mysql加载数据库数据)
- 解决MySQL数据库连接乱码问题(mysql数据库连接乱码)
- 调整MySQL数据库时区以获得正确的时间显示(修改mysql时区)
- MySQL数据库如何生成随机数据?(mysql数据库随机)
- MySQL默认密码,如何修改?(mysql默认密码)
- MySQL数据库完全指南(mysql大全)
- MySQL精准提取字段,快速把握数据概况(mysql选择字段)
- 使用MySQL按年龄划分数据的实现方法(mysql中i按年龄划分)
- 用curl操作MySQL事务实现强大的数据库交互(curl mysql事务)
- cdm如何快速进入MySQL数据库(cdm怎么进入mysql)
- 利用CMD命令行测试MySQL数据库连接(cmd 测试mysql)
- MySQL的三个日志类型解析和使用方法(mysql三大日志区别)
- 如何避免MySQL数据导入失败(mysql不导入数据)
- 使用 MySQL 时不加事务的风险与注意事项(mysql 不加事务)
- MySQL汉化下载指南,让你畅享中文数据库体验(mysql下载汉化)
- MySQL上传文件指令的使用方法(mysql上传文件指令)
- MySQL无法显示全部数据库(mysql不能显示所有库)