序言
隔离级别是mysq数据库中的基础部分,明白了隔离级别有助于我们了解mysql并发以及锁机制,锁机制就是解决在隔离级别的基础上解决并发问题的补充手段。
什么是隔离级别?隔离级别有什么用?
任何支持的数据库,都必须具备着四个特性,原子性、一致性、隔离性、持久性,这样才能够保证数据的正确性。
事务的隔离性就是指,多个并发的事务同时访问一个数据库时一个事务不应该被另外一个事务所干扰,每个并发的事务间要相互隔离。
其实脏读、不可重复读、幻读这些是在不存在隔离性的时候发生的。为了解决这些问题,就引入了隔离级别这一说。
简单说一下事务并发引起的问题:脏读、不可重复读、幻读
脏读:
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据就是脏数据
不可重复读:
事务A多次读取同一数据,事务B在事务A读取的过程中,对数据做了更新的操作并提交,导致事务A多次读取同一数据时,结果不一致
幻读:
系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小节:
不可重复读和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于增加和删除,解决不可重复读的问题只需要锁住满足条件的行,解决幻读就需要锁表。
隔离级别都有哪些?都解决了什么问题?
1、读未提交
顾名思义,就是读取到未提交的内容。因此,在这种情况下,查询时不会加锁的,也就是因为查询不加锁,所以这种隔离级别的一致性是最差的,可能会产生脏读、不可重复读、幻读。
2、读已提交
顾名思义,就是只能读到已经提交的内容。这是各个系统的中最常用的一种隔离级别,也是sqlserver和oracle的默认隔离级别,这种方式能够有效的避免脏读,这种方式是不会加锁的,但是在查询中有可能会显示的加锁,如:
问题:普通的查询时不会加锁的,但是不加锁的话,又是怎么实现避免脏读的呢?
这就要说,另一种机制“快照”,而这种既能够保证一致性又不加锁的读也被成为“快照读”,假设没有快照读,当一个事务更新的时候但是事务没有提交,另一个对更新的数据进行查询的时候就会因为无法查询而被阻塞,这种情况下, 并发能力就相当的差。
3、可重复读
顾名思义,就是针对“不可重复读”这种情况而制定的隔离级别,自然,它可以有效的避免“不可重复读”,而它也是mysql默认的隔离级别。
在这个级别下,普通的查询还是使用的“快照读”,但是和“读提交”不同的是,当事务启动之后,就不允许进行修改操作了,而“不可重复读”恰恰就是因为两次读取的数据之间进行了数据的更新,因此“重复读”能够有效的避免“不可重复读”,但是避免不了“幻读”,因为幻读是由于“插入和删除”而产生的。
4、串行化
这是数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行。这种级别下,“脏读”、“不可重复读”、“幻读”都可以被避免,但是执行效率奇差,性能开销也最大,所以基本没人会用。
总结
也正是有了隔离级别才能够保证并发的问题有所避免,其也是最为基础的知识。朋友们有什么感觉写的有什么的问题或者有什么不对的地方尽管提出来,及时进行回复和修改。