本文共 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:再次查询该条不存在的记录,是查询不出来的,但是如果我尝试修改该条记录,并提交,其实他是可以修改成功的。
版本链:对于该记录的每次更新,都会将值放在一条undo日志中,算是该记录的一个旧版本,随着更新次数的增多,所有版本都会被roll_pointer属性连接成一个链表,即为版本链。
readview:
未提交读:因为可以读到未提交事务修改的记录,所以可以直接读取记录的最新版本就行
已提交读:每次读取之前都生成一个readview 可重复读:只有在第一次读取的时候才生成readview 可串行化:InnoDB涉及了加锁的方式来访问记录转载地址:http://vqezi.baihongyu.com/