1. 已提交读隔离级别 存在的问题:不可重复读、读取被阻塞。 不可重复读的意思是指,用于读取数据的事务在读取问数据后会立即放弃共享锁,这样的话,就会出现另外的事务来更改数据,更改数据的事务具有排它锁,当这个拥有排它锁的事务提交之前,原来的进行读取数据的事务就会发生阻塞(读取不了,因为排它锁和共享锁不相容),所以我没就要把拥有排它锁的事务提交,使其把排它锁释放,这是读取数据的事务就能进行新的读取,这个时候,读取的数据就可能和第一次读取的数据不一样了,这种读取结果的差异性,就是不可重复读。 现在我们来解决读取阻塞的问题——已提交读快照隔离级别 2. 已提交读快照隔离级别 解决读取阻塞的意思就是说,在其他的拥有排它锁的事务没有提交的情况下,我们依然可以执行读取数据的事务,这是因为已提交读快照隔离级别中,事务的读取操作不为数据项添加共享锁。所以就不存在共享锁和排它锁的冲突。也就不会发生读取阻塞的问题。 虽然已提交读快照隔离级别解决了读取被阻塞的问题,但依然没有解决不可重复读的问题,因为等拥有排它锁的事务提交之后,读取数据的事务再次执行,读取的是更改后的数据,得到的结果和以前的有可能不一样,这就是不可重复读。 现在我们来解决不可重复读的问题——快照隔离级别、可重复读隔离级别 3. 快照隔离级别 快照隔离级别之所以能解决不可重复读的问题是因为,当读取的事务再次执行,读取的依然是更改前的数据(也就是该数据项在更改前最后提交的版本)。那么读取的数据肯定是一样的,这就是可重复读。 4. 可重复读隔离级别 可重复读隔离级别在应用时,进行读取的事务在提交之前是不会释放共享锁的,所以就不允许占有排它锁的更改事务对数据进行更改,所以读取事务的去的数据才能保持一致。 值的注意的是,该隔离级别会出现幻读的情况。(在查询语句的查询范围内插入新的记录)——插入数据的操作不会占用排它锁吗? 现在来解决幻读现象的问题——可序列化隔离级别 5. 可序列化隔离级别 可序列化隔离级别可以阻止在事务读取的范围内插入新行;就是在读取数据的事务没有提交之前,不能进行插入数据的操作(能不能进行数据的删除呢?估计也不能)。 |
|
来自: 春树思图南 > 《sql server》