MySQL关系型数据库事务的ACID特性与实现
作者:hqx 发布时间:2024-01-21 13:15:17
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方法都有效,会影响性能。
来源:https://juejin.cn/post/7114326386487230478
猜你喜欢
- 大家一定使用过 phpmyadmin 里面的数据库导入,导出功能,非常方便。但是在实际应用中,我发现如下几个问题: 1、数据库超过一定尺寸,
- 阅读上一篇:什么是名字空间<meta http-equiv="Content-Type" co
- 1.算法:(设查找的数组期间为array[low, high])(1)确定该期间的中间位置K(2)将查找的值T与array[k]比较。若相等
- 在PyCharm 里,显示行号有两种办法:1,临时设置。右键单击行号处,选择 Show Line Numbers。但是这种方法,只对一个文件
- MVC和MTV框架MVCWeb服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们
- 《python基础教程》书中的第四个练习,新闻聚合。现在很少见的一类应用,至少我从来没有用过,又叫做Usenet。这个程序的主要功能是用来从
- 参考网址构建网络我们可以通过torch.nn包来构建网络,现在你已经看过了autograd,nn在autograd的基础上定义模型和求微分。
- 微软在12月22日早上发布新的安全通告证实,一处远程执行代码漏洞影响到了整个SQL Server产品线。该漏洞的入侵代码在两周前已经被公布在
- PHP将ppt转成图片查看PHP安装COM组件1、如php版本>5.3.15,需要保证ext文件夹下有php_com_dotnet.d
- 从MySQL 5.0.2开始,通过mysql_stmt_attr_set() C API函数实现了服务器端光标。服务器端光标允许在服务器端生
- iframe的背景颜色在IE下为window的当前窗口颜色(默认白色,可以在显示外观处对其进行设置),这导致在大幅背景上插入iframe时,
- 题目:请求出任意区间[a,b]的所有素数,简单考虑实用性这道题看起来应该很easy是吧,但任意区间(这个问题有没get 到)Afanty的分
- 我认为在ASP中最好的办法是用编程实现定时刷新Cache,也就是说给Application中储存的设一个过期时间。当然,在ASP中Appli
- 从cmd进入python的方法如下1进入python打开cmd——>直接输入python即可,如下2退出python方法一:先按Ctr
- 我就废话不多说了,直接上代码吧!def _int_iter(): """根据回文数的定义。首先生成
- 前言大家好,我是苏凉,在前面我们已经学习了网络爬虫并且获取到了数据,接下来当然是对数据进行分析啦,本篇文章带大家进入新的模块:pyhon数据
- python中的列表和元组# 1.列表的格式# [数据1,数据2,数据3,···]# 列表 可变数据类型# 列表可以存储多个数据,数据之间的
- 对匿名用户采用 IP 控制访问频率,对登录用户采用 用户名 控制访问频率。from rest_framework.throttling im
- 1|0使用yield完成多任务import timedef test1(): while True: print("-
- 导语害!现在是10月份了,国庆过完也降温了——还有几个月就过年了,哦吼~这一年就快过去了,不知道小编带给大家这么多的表白代码都用了没?用了没