博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql-事务
阅读量:3961 次
发布时间:2019-05-24

本文共 1083 字,大约阅读时间需要 3 分钟。

事务中有一个隔离性特征,理论上在某个事务对某个数据进行访问时,其他事务应该排序,当该事务提交之后,其他事务才能继续访问这个数据。

但是这样子对性能影响太大,我们既想保持事务的隔离性,又想让服务器在出来多个事务时性能尽量高些,所以只能舍弃一部分隔离性而去性能。

事务并发执行的问题

脏写(这个太严重了,任何隔离级别都不允许发生)

sessionA:修改了一条数据,回滚掉

sessionB:修改了同一条数据,提交掉

对于sessionB来说,明明数据更新了也提交了事务,不能说自己啥都没干

脏读:一个事务读到另一个未提交事务修改的数据

session A:查询,得到某条数据

session B:修改某条数据,但是最后回滚掉啦

session A:在sessionB修改某条数据之后,在回滚之前,读取了该条记录

对于session A来说,读到了session回滚之前的脏数据

不可重复读:前后多次读取,同一个数据内容不一样

session A:查询某条记录
session B : 修改该条记录,并提交事务
session A : 再次查询该条记录,发现前后查询不一致

幻读:前后多次读取,数据总量不一致

session A:查询表内所有记录
session B : 新增一条记录,并查询表内所有记录
session A : 再次查询该条记录,发现前后查询不一致

四种隔离级别

数据库都有的四种隔离级别,MySQL事务默认的隔离级别是可重复读,而且MySQL可以解决了幻读的问题。

未提交读:脏读,不可重复读,幻读都有可能发生

已提交读:不可重复读,幻读可能发生
可重复读:幻读可能发生
可串行化:都不可能发生
但凡事没有百分百,emmmm,其实MySQL并没有百分之百解决幻读的问题。
举个例子:

session A:查询某条不存在的记录。

session B:新增该条不存在的记录,并提交事务。

session A:再次查询该条不存在的记录,是查询不出来的,但是如果我尝试修改该条记录,并提交,其实他是可以修改成功的。

MVCC

版本链:对于该记录的每次更新,都会将值放在一条undo日志中,算是该记录的一个旧版本,随着更新次数的增多,所有版本都会被roll_pointer属性连接成一个链表,即为版本链。

readview:

未提交读:因为可以读到未提交事务修改的记录,所以可以直接读取记录的最新版本就行

已提交读:每次读取之前都生成一个readview
可重复读:只有在第一次读取的时候才生成readview
可串行化:InnoDB涉及了加锁的方式来访问记录

转载地址:http://vqezi.baihongyu.com/

你可能感兴趣的文章
matlab2012b与matlab7.1执行set(gca,'Yscale','log')之后画到的直方图结果居然不同
查看>>
回文题
查看>>
AJAX应用之注册用户即时检测
查看>>
File 类小结
查看>>
java除去字符串空格
查看>>
jsp 2.0标记文件
查看>>
Hibernate中Criteria的完整用法
查看>>
sql jsp
查看>>
spring beans beanfactory applicationcontext
查看>>
使用ORM工具进行数据访问
查看>>
使用ORM工具进行数据访问
查看>>
编译与部署Eclipse+Tomcat+MySQL+Liferay4.1.2
查看>>
POJ3728,The merchant(倍增LCA+分治)
查看>>
2019 ICPC Malaysia National,E. Optimal Slots(01背包变形)
查看>>
洛谷P1638 逛画展(双向队列)
查看>>
POJ2892,Tunnel Warfare(线段树维护连续区间)
查看>>
POJ3468,A Simple Problem with Integers(线段树-区间查询-区间更新)
查看>>
杭电ACM——6463(思维)
查看>>
杭电ACM——2069,Coin Change(DP)
查看>>
杭电ACM——2110,Crisis of HDU(母函数)
查看>>