首页 > 数据库 >MYSQL-事务篇

MYSQL-事务篇

时间:2024-08-30 22:52:44浏览次数:6  
标签:事务 隔离 Read 级别 提交 MYSQL 数据

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

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

事务的四大特性

  • 原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性:事务完成时,必须所有数据都保持一致状态。
  • 隔离性:数据库提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性:事务一旦提交或回滚,它对数据库中的数据的改变是永久的。

事务操作 

  •  查看/设置事务提交方式
SELECT @@autocommit;
SET @@autocommit = 0;
  • 开启事务
START TRANSACTION 或 BEGIN;
  • 提交事务 
COMMIT;
  • 回滚事务 
ROLLBACK;

事务演示

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

#开启事务
START TRANSACTION;
SELECT * FROM userinfo;
#进行转账操作
UPDATE userinfo SET money = money - 1000 WHERE name  = '狸花';
UPDATE userinfo SET money = money + 1000 WHERE name  = '吾心悦';
#提交事务
COMMIT;
SELECT * FROM userinfo;

 

 并发事务问题

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

 

事务隔离级别

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

查看事务隔离级别

SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别

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

查看事务隔离级别

 设置事务隔离级别

Read uncommitted隔离级别下的脏读演示

用两个命令行模拟两个客户端进行演示

A端 设置隔离级别为Read uncommitted 开启事务 查询userinfo表数据

B端 开启事务 进行数据修改 未提交事务

A端 再次进行数据查询

B端开启事务执行更新后(未提交),A端查询 发现A端事务读取到B端事务未提交数据(脏读)

 Read committed隔离级别下是否会出现脏读-演示

A端 设置事务隔离级别Read committed 开启事务 进行查询操作

B端 开启事务 进行数据修改 未提交事务

A端  查询表数据未发生变化

B端 事务进行提交

A端 再次查询表数据 

B端事务进行提交后 A端才查询到表数据变化 该隔离级别下规避了脏读

  Read committed隔离级别下不可重复读

 借用上图在B端提交事务后A端事务中同样sql查询数据不一致(受其他事务影响),此问题称之为不可重复读

Repeatable Read隔离级别下解决不可重复读问题

A端  将隔离级别改为Repeatable Read 开启事务 进行表数据查询

B端 开启事务 进行表数据修改并提交

 A端 再次查询

在一个事务中执行两次sql结果是一样(不受其他事务影响),为可重复读 

A端 提交事务后再进行查询 数据发生变化

 Repeatable Read隔离级别下幻读演示

A端 开启事务 查询userinfo表中id为4的数据 

B端 开启事务 插入id为4的数据并提交

A端  插入id为4的数据 发现主键4重复了,再次查询id为4的数据还是没有,这种现象称之为幻读

Serializable隔离级别下解决幻读问题

 A端 设置隔离级别为Serializable 查询表id为5的数据

B端 开启事务 插入id为5的数据 光标一直在闪发生阻塞(A端事务在操作要等其事务提交才能进行操作)

A端 插入id为5的数据并提交

B端 报错主键重复 规避了幻读问题

 

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

标签:事务,隔离,Read,级别,提交,MYSQL,数据
From: https://blog.csdn.net/qq_58378409/article/details/141685908

相关文章

  • [昌哥IT课堂]使用MySQL Shell 部署沙盒数据库实例详解
     概述:这部分解释了如何使用AdminAPI设置沙盒部署。部署和使用本地MySQL的沙盒实例是开始探索AdminAPI的好方法。在将功能部署到生产服务器之前,您可以在本地测试功能。AdminAPI具有内置功能,用于创建正确配置的沙箱实例,以便在本地部署的情况下与InnoDBCluster、InnoDBClusterS......
  • 怎么清除mysql磁盘mysql删除的数据
    在MySQL中,被删除的数据默认情况下是被放置在一个空间上被标记为可重用但实际并未立即释放的状态。这允许快速重用该空间,但如果需要彻底从磁盘上清除这些数据,可以使用OPTIMIZETABLE命令。请注意,OPTIMIZETABLE并不能保证彻底删除数据,因为它的目的是重新组织表并释放未使用的空间......
  • 设置 Nginx、MySQL 日志轮询
    title:设置Nginx、MySQL日志轮询tags:author:ChingeYangdate:2024-8-301.Nginx设置日志轮询机器直接安装的:/etc/logrotate.d/nginx/var/log/nginx/*.log{dailymissingokrotate30compressdelaycompressno......
  • 云计算:LNMP网站架构,前期准备,安装php,安装MySQL
    准备工作(初始化)1.关闭防火墙systemctl disablefirewalld --now    //直接永久关闭防火墙2.关闭SELINUX 查看SELINUX:getenforce永久关闭:[root@localhost~]#vim/etc/selinux/configSELINUX=enforcing|disabled或者[root@localhost~]#sed-i's/^S......
  • 【MySQL 11】索引 (带思维导图)
    文章目录......
  • 【MySQL 12】事务管理 (带思维导图)
    文章目录......
  • 【MySQL 14】用户管理
    文章目录......
  • 【MySQL 13】视图 (带思维导图)
    文章目录......
  • RocketMQ 与 Spring Cloud Stream之事务消息配置
    1引言RocketMQ的事务消息设计是为了解决分布式系统中数据一致性的问题。在分布式系统中,由于数据可能分布在不同的服务或节点上,因此需要一种机制来确保数据的最终一致性。事务消息通过引入本地事务和消息状态的关联,确保了消息的发送与本地事务的执行结果紧密相关,从而避免了......
  • 用PowerDesigner创建Oracle模型转为mysql模型
    一.首先打开PowerDesigner1.File(位置:左上角)–>NewModel–>PhysicalDateModel(物理数据模型)(1)DBMS选择MySQL5.0(版本可能不对,但毕竟是mysql语句的)(2)之后点确定就行(3).可能会出现一个问题就是DBMS的下拉框什么也没有退出也不好用(其实挺简单的)1.点击DBMS最右边......