当前位置:网站首页>MySql实战45讲【事务隔离】
MySql实战45讲【事务隔离】
2022-07-03 02:59:00 【小鱼儿2020】
03 | 事务隔离:为什么你改了我还看不见?
事务就是要保证一组数据库操作,要么全部成功,要么全部失败.
隔离性与隔离级别
ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性.
当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念.
脏读(dirty read)
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。
可重复读
可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据更新(UPDATE)操作。
不可重复读(non-repeatable read)
对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据更新(UPDATE)操作。
幻读(phantom read)
幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。
在同一个事务内查询不出来,但也插入不进去(例如主键冲突),因为被另一个事务插入进入了并提交了
隔离级别 有四种,分别是:读未提交、读已提交、可重复读、序列化。
读未提交: Read Uncommitted,顾名思义,就是一个事务可以读取另一个未提交事务的数据。最低级别,它存在4个常见问题(脏读、不可重复读、幻读、丢失更新)。
读已提交: Read Committed,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 它解决了脏读问题,存在3个常见问题(不可重复读、幻读、丢失更新)。
可重复读: Repeatable Read,就是在开始读取数据(事务开启)时,不再允许修改操作 。它解决了脏读和不可重复读,还存在2个常见问题(幻读、丢失更新)。事务在执行期间看到的数据前后必须是一致的
序列化: Serializable,序列化,或串行化。就是将每个事务按一定的顺序去执行,它将隔离问题全部解决,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
大多数数据库默认的事务隔离级别是 Read Committed
在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。
在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图
在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的.
“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念.
串行化”隔离级别下直接用加锁的方式来避免并行访问.
-- 查看数据隔离界别
show variables like 'transaction_isolation';
可设置的值为:
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
事务隔离的实现
在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。
假设一个值从 1 被按顺序改成了 2、3、4,在回滚日志里面就会有类似下面的记录。
当前值是 4,但是在查询这条记录的时候,不同时刻启动的事务会有不同的 read-view,
如图中看到的,在视图 A、B、C 里面,这一个记录的值分别是 1、2、4,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。
长事务意味着系统里面会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间。
除了对回滚段的影响,长事务还占用锁资源,也可能拖垮整个库。
事务的启动方式
- 显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback
- set autocommit=0(自动启动),这个命令会将这个线程的自动提交关掉。意味着如果你只执行个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接
- 因此,我会建议你总是使用 set autocommit=1, 通过显式语句的方式来启动事务,在 autocommit 为 1 的情况下,用 begin 显式启动的事务,如果执行 commit 则提交事务。information_schema 库的 innodb_trx 这个表中查询长事务
select * from information_schema.innodb_trx
where TIME_TO_SEC(timediff(now(),trx_started))>60
边栏推荐
- [shutter] setup of shutter development environment (supplement the latest information | the latest installation tutorial on August 25, 2021)
- Unity3d human skin real time rendering real simulated human skin real time rendering "suggestions collection"
- Your family must be very poor if you fight like this!
- Can I use read-only to automatically implement properties- Is read-only auto-implemented property possible?
- From C to capable -- use the pointer as a function parameter to find out whether the string is a palindrome character
- Check log4j problems using stain analysis
- Use of check boxes: select all, deselect all, and select some
- Check log4j problems using stain analysis
- Tensorflow to pytorch notes; tf. gather_ Nd (x, y) to pytorch
- I2C 子系統(四):I2C debug
猜你喜欢
函数栈帧的创建与销毁
HW-初始准备
Kubernetes family container housekeeper pod online Q & A?
[error record] the parameter 'can't have a value of' null 'because of its type, but the im
Matlab tips (24) RBF, GRNN, PNN neural network
I2C subsystem (IV): I2C debug
Deep Reinforcement Learning for Intelligent Transportation Systems: A Survey 论文阅读笔记
Baidu map - surrounding search
Privatization lightweight continuous integration deployment scheme -- 01 environment configuration (Part 2)
Left connection, inner connection
随机推荐
Sous - système I2C (IV): débogage I2C
[shutter] monitor the transparency gradient of the scrolling action control component (remove the blank of the top status bar | frame layout component | transparency component | monitor the scrolling
Update and return document in mongodb - update and return document in mongodb
Wechat - developed by wechat official account Net core access
ComponentScan和ComponentScans的区别
Cron表达式介绍
Your family must be very poor if you fight like this!
HW-初始准备
Andwhere multiple or query ORM conditions in yii2
Source code analysis | resource loading resources
Check log4j problems using stain analysis
迅雷chrome扩展插件造成服务器返回的数据js解析页面数据异常
[fluent] future asynchronous programming (introduction | then method | exception capture | async, await keywords | whencomplete method | timeout method)
I2C 子系统(一):I2C spec
Three.js本地环境搭建
Add MDF database file to SQL Server database, and the error is reported
Random shuffle note
[fluent] futurebuilder asynchronous programming (futurebuilder construction method | asyncsnapshot asynchronous calculation)
SQL server queries the table structure of the specified table
C语言中左值和右值的区别