事务隔离级别

事务的隔离级别是根据读写来区分的,并且所讨论的所有问题都是在并发的条件和环境下去讨论的!

读写操作,行级锁,都是对实体纯在的行的进行加锁的,这样也锁也就是对insert,delete无效拉。


更新丢失(Lost update)问题

一般来说第一种是完全的并发状态,并发性非常的高,任何的线程进程都能够对该行数据进行读写操作

这样就会出以下的问题:更新丢失(Lost update)的问题,简单来说就是两个事务同时对一行数据进行了更新写操作,第一个事务先写入数据,第二行接着写入,

但是写入的过程中断,这就导致了数据的丢失,那么第一次更新的数据也就丢失了,这也就是完全没有锁的情况下产生的问题。

那我们自然会想怎么样去解决这个问题呢?


1.读未提交(read uncomminted)

加一个"排他写锁",也就是在一个时间内只能有一个事务能够对该行数据进行写操作,那么自然就解决了并发更新丢失的问题了

但是这样就能完全解决问题了吗?我们来看看还有什么问题,我们既然加了一个“排他写锁”,那么也就是说当一个事务在写入操作一行数据的时候,其他事务都

不能对这样进行写入操作,但是能进行读操作,这样问题就来了,比如:A事务正在写数据,B事务这个时候恰好去读取这行数据,但是由于A事务还没提交commit

由于这个时候A事务可以回滚rollback,那么B事务读到的就是A事务回滚前的数据,这样的数据是和数据库中的数据是不一致的,也就是所谓的”脏读“!

以上的事务隔离级别就是 读未提交(read uncomminted)


2.读已提交(read comminted)

为了解决”脏读“那么我们就可以修改事务的隔离级别为 读已提交(read comminted)也就是在事务A操作修改一行数据,但为提交的时候,其他事务是查询不到该行数据的

当事务A提交以后,其他事务才能查询到该行数据。


3.可重复度(Repeatable Read)

我们再来看一下这种情况,事务B第一次读取了数据之后,事务A紧接着修改了该行数据,然后数据B第二继续读取,但是两次读取到的数据却是不一样的,这就产生了 不可重复读

的问题,那如何解决呢?这可以通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务)---”共享读锁“,写事务则禁止任何其他事务---“排他写锁”

那么也就是这样,当A事务在读取数据的时候,禁止其他写事务的执行,而通过“共享读锁”允许其他读事务的并发读,当A事务在进行写操作时,将通过排他锁来禁止其他一切事务的执行

这也就是可重复度(Repeatable Read)


4.可串行化(Serializable)

以上的都是依据修改的角度去分析的,当然还有一种情况是根据增删情况去分析,就会出现所谓的“幻读”问题了,例如:事务A读取一个表中的数据

select * from emp;得到所有的数据,但是这个时候事务B对该表进行了插入操作,insert into  一条记录,那么事务A再进行读操作的时候,发现新增了一条数据,这也就是所谓的“幻读”

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。



安全性由上倒下增加,并发行降低

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值