美文网首页
数据库事务及其隔离级别

数据库事务及其隔离级别

作者: su_wing | 来源:发表于2017-10-31 02:43 被阅读0次

数据库事务

        在计算机中,通常的事务都是指数据库事务。除此之外还包括java中的事务,jdbc事务,spring中的事务和hibernate事务。【欠】

        事务指的是一组满足ACID四个性质的一组操作序列。即原子性(Automaty)、一致性(consistency)、隔离性(isolation)、持久性(durability)。其中数据“一致性”是最终目标,其他的特性都是为了达到这个目标的措施、要求或手段。【理解为啥保证一致性需要其他三个】

数据库并发

        数据库的并发可以类比java的并发,即多个事务同时对一段数据进行操作。并且和java程序采用对象锁机制进行线程同步类似,DBMS采用数据库锁机制保证事务的隔离性。当多个事务试图对相同的数据进行操作时,只有持有锁的事务才能操作数据。而数据库为了简化用户使用锁的操作,设置了隔离级别,每一种隔离级别都是由相应的锁机制实现的。这就允许用户通过设置隔离级别,使数据库分析SQL语句,自动为某行数据或某表加上适合的锁。隔离级别约高,越能保证数据完整性和一致性,数据的并发性将会越低。当隔离级别达到最强时,事务将顺序访问数据。

        首先介绍数据库中的锁机制,再介绍由锁机制实现的各种隔离级别。

(1)数据库锁

        数据库的锁关系如下图所示。

        若事务为某行数据加上了共享锁,则会防止其他事物的排它锁,允许其他共享锁定。若是排它锁,则会防止排它锁和共享锁。实质上就是能实现并发的读,读写,写写都是串行化的。

        以上是在锁定的关系上看的锁的定义;还可以在加锁对象的层面上定义锁,可分为表锁定、行锁定。

(2)隔离级别

        事务并发操作会导致三类问题,对应四种隔离级别。以下从隔离级别层面介绍各级别可解决的问题、会产生的问题及其锁的机制。

·读未提交

加锁机制为:读--不加锁,写--行共享锁

问题:脏读。由隔离级别的名称“读未提交”即可知,脏读指的是事务A读到了事务B更改的未提交的数据,之后事务B又将更改操作rollback了,事务A读到的数据就是脏数据,即为脏读。

问题原因:1.由于写操作只对某行数据加了共享锁,导致写事务在事务未提交之前,其他事务也可以访问该数据。2.读操作未加任何锁,读的过程也可能发生写操作。

·读已提交

加锁机制为:读--行共享锁,写--行排它锁,锁在完成对该行数据的操作时释放。(可解决脏读问题,因为读的过程中不允许写操作)

问题:不可重复读。不可重复读指的是在同一事务A中,对该行数据进行了两次读访问,两次读取的结果不一致的问题(主要指内容,特指某行数据)。

问题原因:当第一次读完成后,事务A释放了该行数据的共享锁,此时事务B对该行数据进行更改(加上排它锁),并提交事务【???事务的更新操作是会在事务提交之后才会释放锁吗。感觉是持久化到数据库之后才算是写完了,才会释放锁】。此时,事务A继续进行第二次读访问,就会发现两次读取的结果不一致,导致不可重复的的问题。

·可重复读

加锁机制为:读--行共享锁,写--行排它锁,锁在完成事务提交时释放。(可解决不可重复读问题,因为在同一个事务的两次读写完成之前,不允许进行写操作)

问题:幻读。幻读指的是在同一事务A中,用同样的操作读取两次,得到的记录数不相同(主要指数量,一般是查询时)。

问题原因:只在行上加了锁,但不能控制表中其他数据的变化。例如,当事务A使用某一条件查询数据时,得到结果集是10条记录,此时事务B执行insert操作(不影响事务A在某一行加上的锁),刚好插入的数据也满足查询条件,那么当事务A再查询时,就会发现记录数变成了11,即为脏读。

·可序列化

加锁机制为:读--表共享锁,写--表排它锁(可解决幻读问题,因为在同一个事务的两次查询提交之前,不允许对表进行任何操作)

问题:无敌了,事务顺序执行,没有并发问题。

(3)默认隔离级别

Oracle:读已提交

MySql:可重复读

仍然存在的几个问题

1.锁与隔离机制的关系是:通过锁实现隔离级别吗?实现数据库的自动加锁?

2.若1成立,锁是都使用悲观锁吗,乐观锁在其中发挥的作用是什么?

3.乐观锁应用场景我知道,使用乐观锁的时候是要关闭隔离级别吗?

4.读取操作可在读完不提交事务时释放锁,更新事务释放行锁的时机是?未提交事务前可以释放行锁吗?如果可以的话仍然存在脏读。。

5.第一类丢失更新,第二类丢失更新。。

相关文章

网友评论

      本文标题:数据库事务及其隔离级别

      本文链接:https://www.haomeiwen.com/subject/irkvpxtx.html