MySQL事务操作的四大特性以及并发事务问题


Posted in MySQL onApril 12, 2022

引言

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

就比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加1000。

这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。

MySQL事务操作的四大特性以及并发事务问题

正常情况: 转账这个操作, 需要分为以下这么三步来完成 , 三步完成之后, 张三减少1000, 而李四 增加1000, 转账成功 :

MySQL事务操作的四大特性以及并发事务问题

异常情况: 转账这个操作, 也是分为以下这么三步来完成 , 在执行第三步是报错了, 这样就导致张三减少1000块钱, 而李四的金额没变, 这样就造成了数据的不一致, 就出现问题了。 

MySQL事务操作的四大特性以及并发事务问题

为了解决上述的问题,就需要通过数据的事务来完成,我们只需要在业务逻辑执行之前开启事务,执行完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。

MySQL事务操作的四大特性以及并发事务问题

注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务

1、事务操作

数据库脚本: 

drop table if exists account;
create table account
(
    id    int primary key AUTO_INCREMENT comment 'ID',
    name  varchar(10) comment '姓名',
    money double(10, 2) comment '余额'
) comment '账户表';
insert into account(name, money)
VALUES ('张三', 2000),
       ('李四', 2000);

1.1 未控制事务

1、测试正常情况

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

测试完毕之后检查数据的状态, 可以看到数据操作前后是一致的

MySQL事务操作的四大特性以及并发事务问题

2、 测试异常情况

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三'; 出错了....
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四'

我们把数据都恢复到2000, 然后再次一次性执行上述的SQL语句(出错了.... 这句话不符合SQL语法,执行就会报错),检查最终的数据情况, 发现数据在操作前后不一致了

MySQL事务操作的四大特性以及并发事务问题

1.2 控制事务一

1、查看/设置事务提交方式

SELECT @@autocommit ; 
SET @@autocommit = 0 ;

2、 提交事务

COMMIT;

3、回滚事务

ROLLBACK;

注意:

上述的这种方式,我们是修改了事务的自动提交行为, 把默认的自动提交修改为了手动提交, 此时我们执行的DML语句都不会提交, 需要手动的执行commit进行提交。

1.3 控制事务二

1、开启事务

START TRANSACTION 或 BEGIN ;

2、提交事务

COMMIT;

3、回滚事务

ROLLBACK;

转账案例:

-- 开启事务 
start transaction 
-- 1. 查询张三余额 
select * from account where name = '张三'; 
-- 2. 张三的余额减少1000 
update account set money = money - 1000 where name = '张三'; 
-- 3. 李四的余额增加1000 
update account set money = money + 1000 where name = '李四'; 
-- 如果正常执行完毕, 则提交事务 
commit; 
-- 如果执行过程中报错, 则回滚事务 
-- rollback;

2、事务的四大特性

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

上述就是事务的四大特性,简称ACID。

3、并发事务问题

1、赃读:一个事务读到另外一个事务还没有提交的数据。

MySQL事务操作的四大特性以及并发事务问题

2、不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。

MySQL事务操作的四大特性以及并发事务问题

3、幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影“。

MySQL事务操作的四大特性以及并发事务问题

4、事务隔离级别

为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:

MySQL事务操作的四大特性以及并发事务问题

1、查看事务隔离级别

SELECT @@TRANSACTION_ISOLATION; 1

2、设置事务隔离级别

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL 
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

注意:事务隔离级别越高,数据越安全,但是性能越低

MySQL 相关文章推荐
数据库连接池
Apr 06 MySQL
mysql批量新增和存储的方法实例
Apr 07 MySQL
详解Mysql 函数调用优化
Apr 07 MySQL
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
浅谈MySQL 亿级数据分页的优化
Jun 15 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
MySQL数据库优化之通过索引解决SQL性能问题
Apr 10 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 MySQL
MySql重置root密码 --skip-grant-tables
MySQL库表太大怎么办? 数据库分库分表项目实践
排查MySQL生产环境索引没有效果
Apr 11 #MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 #MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
MySQL数据库优化之通过索引解决SQL性能问题
Apr 10 #MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 #MySQL
You might like
PHP的自定义模板引擎
2017/03/24 PHP
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
jquery.form.js用法之清空form的方法
2014/03/07 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
python3爬取各类天气信息
2018/02/24 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
python检测IP地址变化并触发事件
2018/12/26 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
女士鞋子、包包和服装在线,第一款10美元:ShoeDazzle
2019/07/26 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
英文自荐信格式
2013/11/28 职场文书
小学生班会演讲稿
2014/01/09 职场文书
小学生期末自我鉴定
2014/01/19 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
客户经理岗位职责
2015/01/31 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书
Javascript中的解构赋值语法详解
2021/04/02 Javascript