当前位置:网站首页>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
边栏推荐
- Deep learning: multi-layer perceptron and XOR problem (pytoch Implementation)
- How to use asp Net MVC identity 2 change password authentication- How To Change Password Validation in ASP. Net MVC Identity 2?
- The base value is too large (the error is marked as "08") [duplicate] - value too great for base (error token is'08') [duplicate]
- [Fuhan 6630 encodes and stores videos, and uses RTSP server and timestamp synchronization to realize VLC viewing videos]
- SQL statement
- [flutter] example of asynchronous programming code between future and futurebuilder (futurebuilder constructor setting | handling flutter Chinese garbled | complete code example)
- JMeter performance test JDBC request (query database to obtain database data) use "suggestions collection"
- Didi programmers are despised by relatives: an annual salary of 800000 is not as good as two teachers
- sql server数据库添加 mdf数据库文件,遇到的报错
- 分布式事务
猜你喜欢

Sqlserver row to column pivot
![[error record] the parameter 'can't have a value of' null 'because of its type, but the im](/img/1c/46d951e2d0193999f35f14d18a2de0.jpg)
[error record] the parameter 'can't have a value of' null 'because of its type, but the im

Kubernetes family container housekeeper pod online Q & A?

Deep learning: multi-layer perceptron and XOR problem (pytoch Implementation)

Thunderbolt Chrome extension caused the data returned by the server JS parsing page data exception

Xiaodi notes

"Analysis of 43 cases of MATLAB neural network": Chapter 43 efficient programming skills of neural network -- Discussion Based on the characteristics of the new version of MATLAB r2012b

一文带你了解 ZigBee

HTB-Devel

力扣------网格中的最小路径代价
随机推荐
Source code analysis | layout file loading process
Strategy application of Dameng database
Deep Reinforcement Learning for Intelligent Transportation Systems: A Survey 论文阅读笔记
Deep learning: multi-layer perceptron and XOR problem (pytoch Implementation)
random shuffle注意
C语言中左值和右值的区别
JS finds all the parent nodes or child nodes under a node according to the tree structure
Random shuffle note
【Flutter】shared_ Preferences local storage (introduction | install the shared_preferences plug-in | use the shared_preferences process)
Three. JS local environment setup
Pytest (6) -fixture (Firmware)
TCP 三次握手和四次挥手机制,TCP为什么要三次握手和四次挥手,TCP 连接建立失败处理机制
Use optimization | points that can be optimized in recyclerview
[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
ComponentScan和ComponentScans的区别
Practice of traffic recording and playback in vivo
Force freeing memory in PHP
A2L file parsing based on CAN bus (2)
Counter统计数量后,如何返回有序的key
Andwhere multiple or query ORM conditions in yii2