MySQL事物

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL事物

MySQL事物


1、事务概念

  1. 事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果,保证事务执行的原子操作
  2. 事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上
  3. 事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态


2、事物处理命令

#查看MySQL是否自动提交事务
SELECT @@AUTOCOMMIT;#0表示手动提交事务,1表示自动提交事务
#设置事务提交方式为手动提交方式
set autocommit=0;
#开启一个事务
BEGIN;
#提交一个事务
COMMIT; 
#回滚一个事务到初始的位置
ROLLBACK; 
#设置一个名字为point1的保存点
SAVEPOINT point1; 
#事务回滚到保存点point1,而不是回滚到初始状态
ROLLBACK TO point1; 
#设置事务的隔离级别
SET TX_ISOLATION='REPEATABLE-READ'; 
#查询事务的隔离级别
SELECT @@ TX_ISOLATION; 


3、ACID特性

  • 每一个事务必须满足下面的4个特性:
  1. 事务的原子性(Atomic):

事务是一个不可分割的整体,事务必须具有原子特性,及当数据修改时,要么全执行,要么全不执行,即不允许事务部分的完成

  1. 事务的一致性(Consistency):

一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。

就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务,总体上数据是不变的,保持一致性转态

  1. 事务的隔离性(Isolation):

当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到,使得并发执行的各个事务之间不能互相影响

  1. 事务的持久性(Durability):

事务完成(commit)以后,DBMS保证它对数据库中的数据的修改是永久性

例如,事物再提交之后,在数据库刷盘过程中,即便因为故障出错,也应该能够恢复数据

  • ACID的底层实现:

ACD依靠的是数据库的redo log和undo log实现的;I是依赖数据库的锁实现的


4、事务并发存在的问题

  • 事务处理不经隔离,并发执行事务时通常会发生以下的问题:
  1. 脏读(Dirty Read):

一个事务读取了另一个事务未提交的数据

例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据(事务B读取了事务A尚未提交的数据)

92579d038f22ed90b3e612d744b619ba.png

  1. 不可重复读(NonRepeatable Read):

一个事务的操作导致另一个事务前后两次读取到不同的数据

例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样

f179d1aa27ef97848252be26d3204988.png

  1. 虚读(Phantom Read)幻读:

一个事务的操作导致另一个事务前后两次查询的结果数据量不同

例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了

1ac68f56b655f7696a7e5f9b18d1a91d.png

脏读和不可重复读是基于数据值的错误,幻读是基于条数增加或者减少的错误


5、事务的隔离级别

  • MySQL支持的四种隔离级别是:

1、TRANSACTION_READ_UNCOMMITED

未提交读:说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据,不可重复读和虚读都是被允许的

set tx_isolation='READ-UNCOMMITTED';

0a8afe1a2e94762b0d88368bfceffb89.png

2、TRANSACTION_READ_COMMITED

set tx_isolation='READ-COMMITTED';

已提交读:说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生

7faeae3e64fb5c174d4663965c2daaa0.png

3、TRANSACTION_REPEATABLE_READ

可重复读:说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现

set tx_isolation='REPEATABLE-READ';

0e7856008393cea756e852811942eb02.png

  • 说明:

在目前版本中,可重复读在一定程度上可以避免insert/delete幻读,但是无法避免update幻读

4、TRANSACTION_SERIALIZABLE

串行化:是最高的事务级别,它防止读脏数据,不可重复读和虚读。

set tx_isolation='SERIALIZABLE';


c73e4d9cd0890d2fb08fa34bd3674ab7.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 存储 关系型数据库
MySQL事务实践
MySQL事务实践
114 0
|
7月前
|
SQL 存储 关系型数据库
MySQL的事务(看看也许有帮助呢)
【5月更文挑战第18天】MySQL的事务
47 3
|
7月前
|
存储 SQL 关系型数据库
Mysql_数据库事务
Mysql_数据库事务
|
SQL 关系型数据库 MySQL
【MySQL进阶-04】深入理解mysql事务本质(超级详解)
【MySQL进阶-04】深入理解mysql事务本质(超级详解)
135 1
|
Oracle 关系型数据库 MySQL
MySQL事务中幻读实践
MySQL事务中幻读实践
103 0
|
存储 关系型数据库 MySQL
MySQL中的事物
MySQL中的事物
93 0
|
SQL 存储 缓存
MySQL:索引与事物
MySQL:索引与事物
140 0
MySQL:索引与事物
|
SQL 安全 关系型数据库
MySQL 04 基础之事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
|
SQL 缓存 关系型数据库
MySQL复习资料(八)——MySQL-事务
MySQL复习资料(八)——MySQL-事务
180 0
MySQL复习资料(八)——MySQL-事务
|
存储 SQL 关系型数据库
MySQL进阶:MySQL事务(理论一)
MySQL 事务主要用于处理操作量大,复杂度高的数据。比方我想要删除一个用户(销户)以及这个用户的个人信息、订单信息以及其他信息,这里会涉及到很多SQL语句的执行来满足我们的业务需求,我们要一次性删除这些数据,这些数据库操作语句就构成了一个事务。 那么在MySQL数据库中,我们如何查看存储引擎是否支持事务呢?下面我就从我实验机器上的MySQL来一探究竟。
MySQL进阶:MySQL事务(理论一)