当前位置: 首页 > news >正文

【MySQL基础篇】事务

事务简介

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

典型事例:银行转账操作

假设张三向李四进行转账操作首先第一步我们应该查询张三用户的余额,如果余额充足,则张三用户余额减少,最后李四用户余额增加

事务的步骤分为:1、开启事务2、回滚事务(把临时修改的数据恢复回去,能够保证如果出现异常,全部操作都会回滚,保证数据的完整性和一致性)3、提交事务

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

事务操作 

· 查看/设置事务提交方式

SELECT @@autocommit;

SET @@autocommit=0;

· 提交事务

COMMIT; 

· 回滚事务

ROLLBACK; 

#事务操作
#数据准备
create table account(id int primary key auto_increment comment '主键ID',name varchar(10) comment '姓名',money int comment '余额'
)comment '账户表';
insert into account values(null,'张三',2000),(null,'李四',2000);
#转账操作
select @@autocommit;
set @@autocommit=0;
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;
#恢复数据
update account set money=2000 where name='张三'||name='李四';

方式二:不设置事务的提交方式

·  开启事务

START TRANSACTION 或 BEGIN;

·  提交事务

COMMIT; 

 ·  回滚事务

rollback;

#方式二:
start transaction ;
set @@autocommit=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;

事务四大特性:ACID

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

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

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

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

并发事务问题 

问题描述
脏读一个事务读到另一个事务还没有提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影“

 

 

事务的隔离级别 

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read(默认)××
Serializable×××

注意:从上到下隔离级别越来越高, Serializable隔离级别最高但性能最差;Read uncommitted隔离级别最低(数据安全性最差),但性能最优。

#查询事务隔离级别

SELECT @@TRANSACTION_ISOLATION;

#设置事务隔离级别

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

#查看事物的隔离级别
select @@transaction_isolation;
#设置事务隔离级别
set session transaction isolation level read uncommitted;
#改回默认值
set session transaction isolation level repeatable read ;

脏读演示:(两个客户端演示)

#第一个客户端
mysql> use test
Database changed
mysql> set session transaction isolation level read uncommitted-> ;
Query OK, 0 rows affected (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1000 |
|  2 | 李四 |  2000 |
+----+------+-------+
#第二个客户端
mysql> use test
Database changed
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> update account set money=money-1000 where name='张三';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

不可重复读:(此时隔离级别为Read committed)

#第一个客户端
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  1000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)
#第二个客户端
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> update account set money=money+1000 where name='张三';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> commit;
Query OK, 0 rows affected (0.00 sec)

幻读:(此时隔离级别为Repeatable read)

#第一个客户端start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> select * from account where id=3;
Empty set (0.00 sec)insert into account(id,name,money) values(3,'王小五',2000);
ERROR 1062 (23000): Duplicate entry '3' for key 'account.PRIMARY'
mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 张三 |  2000 |
|  2 | 李四 |  2000 |
|  3 | 王五 |  2000 |
+----+------+-------+
3 rows in set (0.00 sec)
#第二个客户端start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> insert into account(id,name,money) values(3,'王五',2000);
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.00 sec)

 

 

 

 

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • RabbitMq,通过prefetchCount限制消费并发数
  • 排序之冒泡排序
  • 掌握构建魔法:Gradle中Groovy插件的配置秘籍
  • 深度解析 PostgreSQL Protocol v3.0(三)— 流复制(上)
  • i7-13700K负载过高时出现无故自动重启(蓝屏问题)
  • 小白的OS Copilot 产品测评
  • 微信小程序毕业设计-学习资料库系统项目开发实战(附源码+论文)
  • ETL数据集成丨主流ETL工具(ETLCloud、DataX、Kettle)数据传输性能大PK
  • 启动完 kubelet 日志显示 failed to get azure cloud in GetVolumeLimits, plugin.host: 1
  • 2024辽宁省大学数学建模竞赛试题思路
  • 什么是面向对象编程
  • MVC 控制器 中Action 不能同名,参数不一样,路由器寻找不到对应的,要加特性
  • Python-PLAXIS自动化建模技术与典型岩土工程案例
  • 新版Android Studio中设置gradle的JDK版本
  • python:在同一视窗中画出三个函数的图形
  • .pyc 想到的一些问题
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【347天】每日项目总结系列085(2018.01.18)
  • bearychat的java client
  • Fastjson的基本使用方法大全
  • HTML中设置input等文本框为不可操作
  • java8 Stream Pipelines 浅析
  • Laravel Telescope:优雅的应用调试工具
  • laravel with 查询列表限制条数
  • LintCode 31. partitionArray 数组划分
  • node入门
  • text-decoration与color属性
  • vue 配置sass、scss全局变量
  • vuex 笔记整理
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • Yeoman_Bower_Grunt
  • 解决iview多表头动态更改列元素发生的错误
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 数据仓库的几种建模方法
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • ( 10 )MySQL中的外键
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (SpringBoot)第二章:Spring创建和使用
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)重识new
  • (转载)从 Java 代码到 Java 堆
  • .apk 成为历史!
  • .bat批处理(一):@echo off
  • .gitignore不生效的解决方案
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net IE10 _doPostBack 未定义
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)