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 相关文章推荐
MySQL infobright的安装步骤
Apr 07 MySQL
MySQL数字类型自增的坑
May 07 MySQL
MySQL 使用自定义变量进行查询优化
May 14 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
mysql 数据插入优化方法之concurrent_insert
Jul 01 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL 用 limit 为什么会影响性能
Sep 15 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
一文了解MySQL二级索引的查询过程
Feb 24 MySQL
MySQL 执行数据库更新update操作的时候数据库卡死了
May 02 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 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实现WEB动态网页静态
2006/10/09 PHP
我用php+mysql写的留言本
2006/10/09 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
JavaScript修改css样式style
2008/04/15 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
[01:50]2014DOTA2西雅图邀请赛 专访欢乐周宝龙
2014/07/08 DOTA
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
python 字典中取值的两种方法小结
2018/08/02 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
美国购车网站:TrueCar
2016/10/19 全球购物
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
早会主持词
2014/03/17 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
务工证明怎么写
2015/06/18 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
2022年显卡天梯图(6月更新)
2022/06/17 数码科技
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle