首页 > 数据库 >MySQL20 - 事务

MySQL20 - 事务

时间:2023-01-08 17:22:21浏览次数:35  
标签:语句 事务 读取数据 回滚 提交 MySQL20 隔离

事务 TRANSACTION

什么是事务?

一个事务就是一个完整的业务逻辑 -- 划分一个最小的业务单元,整个操作同时完成同时失败

只有 DML语句 - INSERT、DELETE、UPDATE 才会涉及事务


为什么使用事物?

业务需要多条 SQL - DML语句才能完成,确保这些语句同时完成或失败,保证数据一致性


事务的原理,如何实现多条语句同时成功或失败?

在事物的执行过程中,每一条 DML语句操作都会记录到 “事务性活动的日志文件” 中

在事物的执行过程中,即可以提交事务,也可以回滚事务

  • 提交事务

    • 事务开启后,执行DML语句,最后成功时提交事物,标志事务成功结束
  • 回滚事务

    • 将事务开启后所有执行的DML语句全部撤销,并清空事务性活动的日志文件 = 事务以失败结束
    • 回滚事务,标志事务全部失败的结束

如何提交事物与回滚事务?

提交事务

  • COMMIT;
    
  • MySQL默认情况下,支持自动提交事务

回滚事务

  • ROLLBACK;
    
  • 回滚永远只能提交到上一次的提交点

关闭自动提交事务 -- 手动开启一个需要手动提交\回滚的事务

  • START TRANSCTION;
    
  • 事务中,DML语句不直接修改数据库中的数据 -- 不记录在数据库对应表的存储文件中

  • 但能够查询到全部记录,包括事务中还未存入表的记录 -- 查询会读取事务性活动的日志文件的内容

  • COMMIT 和 ROLLBACK 都会结束事务


事务 4 特性 ACID

  • A:原子性
    • 事务是最小工作单元,不可再分
  • C:一致性
    • 一个事务的所有操作必须同时成功、同时失败
  • I:隔离性
    • 不同事务操作同一张表,需要设置隔离级别
  • D:持久性
    • 事务提交,将没有保存到硬盘的数据保存到硬盘上,实现数据持久化

事物的隔离性

隔离级别

//设置隔离级别 -- 需要新建查询
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
//查看隔离级别
SELECT @@tx_isolation;
  • 读未提交:read uncommitted (最低级别) 事务B提交前事务A就能读到
    • 事务A可以读取到事物B未提交的数据
    • 存在问题:脏读现象 Dirty Read,事务B可能将未提交的数据回滚,数据在事物A中为脏数据
    • 这种隔离级别一般存在于理论上,实际不使用
  • 读已提交:read committed 事务B提交后事务A才能读到
    • 事务A只能读取到事务B已经提交的数据
    • 解决脏读现象
    • 新问题:不可重复读取数据,事务A两次读取数据可能不一致,因为期间有其他事务修改数据库
    • 在实际使用中常用,是Oracle数据库默认的隔离级别
  • 可重复读:repeatable read 事务B提交之后事务A也读不到
    • 事务A开启后,无论多久,每次读取数据都是一致的,其他事务对数据库的修改不影响事务A
    • 解决不可重复读取数据的问题
    • 新问题:每一次读取数据可能是幻象(开启事务时的备份),不够真实
    • 是MySQL数据库默认的隔离级别 ,也是银行总账读取数据时的隔离级别
  • 序列化/串行化:serializable (最高级别)
    • 事务间不能并行,一次执行一个事务
    • 解决所有问题,但效率最低

标签:语句,事务,读取数据,回滚,提交,MySQL20,隔离
From: https://www.cnblogs.com/Ashen-/p/17034929.html

相关文章

  • @Transactional事务回滚异常:Transaction rolled back because it has been marked as
    问题描述事务设置手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()代码需要返回比较友好的提示,但try…catch了,事务就不......
  • 多线程的事务回滚问题
    多线程的事务回滚问题环境要求1.mybatis-plus或mybatis2.支持单表的增删改查3.书写工具类将集合平分,获取线程池importjava.util.ArrayList;importjava.util.List;......
  • 一文掌握Spring事务的基本使用
    1依赖Spring事务的实际源码在spring-tx中:<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency>在Spring体......
  • 分布式事务解决方案-后端分析
    一、什么是分布式事务在早期的单体架构时期,所有的数据操作都在同一个数据库里面进行,比如:A给B转100块钱,A的账户余额-100,B的账户余额+100,这两个操作放在同一个事务里面即可,......
  • 在微服务内部,调用另一个微服务,如何保证事务的一致性
    虽然,我们通常建议涉及到事务的情况下,不要在一个微服务里,调用另外一个微服务,但有时也会遇到无法避开的情况,那我们就来看看应该如何保证事务的一致性。我们先来看看微服务A......
  • [SQL Server] 循环游标执行-无事务
    From: https://blog.csdn.net/weixin_42609389/article/details/126955029begindeclare@aintdeclare@tempvarchar(50)set@a=1declareor......
  • Redis事务
    参考资料:https://www.cnblogs.com/wkfvawl/p/15754956.html事务1.1事务定义Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的......
  • Mysql的事务原理
    一、持久性依靠的是redolog,重做日志,记录的是事务提交时数据也的物理修改,是用来实现事务的持久性。该日志文件由两部分组成,重做日志缓冲,(redologbuffer)和重做日志......
  • Redis-03 Redis事务
    需要特别注意,Redis的命令是原子性的,而Redis的事务是非原子性的事务相关命令MULTI命令开启事务命令,Redis将操作命令逐个放到队列中,根据EXEC命令来原子化执行命令EXE......
  • Spring 事务源码(五):事务的传播特性
    1、事务传播特性Springs事务传播特性: 名称解释 REQUIRED支持当前事务,如果当前没有事务,就新建一个事务。Spring默认的事务传播特性支持外......