首页 > 其他分享 >03 事务隔离

03 事务隔离

时间:2024-02-20 13:45:25浏览次数:24  
标签:语句 03 事务 隔离 V1 V2 提交

03 事务隔离

事务:保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。

事务ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。


建议你尽量不要使用长事务。****

读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )

值得注意的是,隔离得越严实,效率就会越低。

读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
读提交:一个事务提交之后,它做的变更才会被其他事务看到。
可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的,未提交变更对其他事务也是不可见的。
串行化:对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
  1. 若隔离级别是“读未提交”, V1 是 2。这时候事务 B 虽然还没有提交,但是结果已经被 A 看到了。因此,V2、V3 也都是 2。
  2. 若隔离级别是“读提交”,V1 是 1,V2 是 2。事务 B 的更新在提交后才能被 A 看到。所以, V3是 2。
  3. 若隔离级别是“可重复读”,则 V1、V2 是 1,V3 是 2。V2 还是 1,事务在执行期间看到的数据前后必须是一致的
  4. 若隔离级别是“串行化”, V1、V2 值是 1,V3 的值是 2。事务A一开始查询值1的时候就获得了读锁,根据两阶段加锁,事务A获得的锁要在commit的时候才释放,所以事务B在修改1为2的时候申请写锁会阻塞直到事务A提交事务A提交之前获取的值都是1,所以V1 V2都是1,事务A提交后事务B获取到写锁完成更新操作,所以V3是2

长事务:意味着系统里面会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间。

MySQL 的事务启动方式:
  1. 显式启动事务语句:begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。
  2. set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。

建议你总是使用 set autocommit=1, 通过显式语句的方式来启动事务


问:如何避免长事务对业务的影响?

答:

从应用开发端来看

  1. 确认是否使用了 set autocommit=0。
  2. 确认是否有不必要的只读事务。
  3. 业务连接数据库的时候,通过 SET MAX_EXECUTION_TIME 命令,控制每个语句执行的最长时间,避免单个语句意外执行太长时间。

从数据库端来看

  1. 监控 information_schema.Innodb_trx 表,设置长事务阈值,超过就报警 / 或者 kill;
  2. Percona 的 pt-kill 工具不错;
  3. 在业务功能测试阶段要求输出所有的 general_log,分析日志行为提前发现问题;
  4. MySQL 5.6 或者更新版本,把 innodb_undo_tablespaces 设置成 2(或更大的值)。如果真的出现大事务导致回滚段过大,这样设置后清理起来更方便。

标签:语句,03,事务,隔离,V1,V2,提交
From: https://www.cnblogs.com/itiancong/p/18022904

相关文章

  • Godot学习中的问题及思考、学习笔记 03
    GameManager类在Godot项目中通常扮演着游戏管理器的角色,负责协调游戏内不同系统、状态和数据的管理。它是一种设计模式,用于集中管理游戏逻辑和状态,使得游戏的结构更加清晰,也便于维护和扩展。GameManager可以处理多种任务,包括但不限于:游戏状态管理:控制游戏的当前状态,比如开始......
  • because it set 'X-Frame-Options' to 'sameorigin'
    报错becauseitset'X-Frame-Options'to'sameorigin'.Refusedtodisplay'https://xxx.xxx.cn/'inaframebecauseitset'X-Frame-Options'to'sameorigin'.解决方法:修改页面,增加meta配置<head><!--CSP......
  • day03
    day03目录day03Vue生命周期Vue生命周期钩子工程化开发和脚手架开发Vue的两种方式脚手架VueCLI基本介绍好处使用步骤项目目录介绍和运行流程项目目录介绍运行流程组件化开发根组件App.vue组件是由三部分构成普通组件的注册使用—局部注册特点步骤使用方式注意语法普通组......
  • BEV-IO: Enhancing Bird's-Eye-View 3D Detection with Instance Occupancy
    通过显式和隐式的Occupancy预测来做3D检测,用Occupancy弥补了深度图的局限性。设计了3D几何分支和特征传播分支,预测depth-occupancy权重来实现3D检测,由于点级Occupancy的构建依赖于bbox,使整个感知模型与检测任务强相关。Abstract传构建BEV表示的方法是基于显式预测的深度分布,将2D......
  • E. Anna and the Valentine's Day Gift
    原题链接题解游戏规则总结一句话:安娜要尽可能删掉后导零(翻转),萨沙要尽可能保护后导零(连接),问剩余数字的位数能否达到\(m+1\)位直接模拟即可,统计每个数后导零的长度,然后按照安娜先手的规则求出能保留多少位后导零,最后判断长度code#include<bits/stdc++.h>usingnamespaces......
  • 【专题】2030年中国汽车行业趋势展望报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35173原文出处:拓端数据部落公众号汽车行业正站在发展的关键节点。面对多样的消费群体、创新的商业模式以及颠覆性技术对产业链、价值链和生态圈的深刻变革,行业在追求极致用户体验的同时,还面临着巨大的成本优化压力。这些因素将共同塑造中国汽车行......
  • 【Spring】【Mybatis】【Dynamic-Datasource】【事务】Spring + MyBaits + 事务 + 动
    1 前言我上次有一篇是讲了从一个数据库连接的角度分析了 Spring+MyBaits+事务三者的联系,这是在数据源固定的情况下。那么可能会遇到,比如按租户的分库,这种情况下我们会引入动态的数据源比如苞米豆团队的Dynamic-Datasource或者是自己公司内部封装的工具、框架等,这节我们......
  • 03 进阶篇-高阶数据类型BitMaps、HyperLogLogs
    BitMaps介绍BitMaps的基本概念,它是一种通过位来表示数据的方法,能高效地处理大量布尔值。展示BitMaps在用户在线状态、统计等方面的应用示例。介绍相关的命令,如SETBIT,GETBIT,BITCOUNT,BITOP等。BitMaps的基本概念BitMaps,或称为位图,是Redis中用于高效处理大量布尔值的......
  • code: 'ERR_OSSL_EVP_UNSUPPORTED' 报错解决
    报错:Error:error:0308010C:digitalenveloperoutines::unsupportedatnewHash(node:internal/crypto/hash:69:19)atObject.createHash(node:crypto:133:10)atBulkUpdateDecorator.hashFactory(D:\WzProject\wz-middle-ground-frontend\node_module......
  • ts接口03
    //接口对对象的形状进行描述可以理解为一种约束//?表示为可选属性,表示可有可无//[prop:string]代表任意属性,当不确定属性名的时候,属性类型,可以使用,但是要注意的是,一旦确定了不是any类型,而是string,number,Boolean之类的,其他的类型也会变成他的子集//[prop:string]中如......