脏读,不可重复读,幻读

事务的特性:

ACID

原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。 
一致性(Consistemcy):事务前后,数据库的状态都满足所有的完整性约束。 
隔离性(Isolation):并发执行的N个事务是隔离的,一个不影响一个,一个事务在没有commit之前,被修改的数据不可能被其他事务看到(通过设置数据库的隔离级别)。 
持久性(Durability):持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。持久性主要在于DBMS的恢复性能

数据库的脏读、不可重复读、幻读都和事务的隔离性有关

脏读:事务A未提交时,事务B就读了事务A未提交的数据(更新) 因为事务A有可能回滚。

换句话说就是:在一个事务中读取到另一个事务没有提交的数据

不可重复读:事务B一直未提交,并且多次查询某条数据,而事务A去修改该数据修改之后并提交,但在这个过程中,事务B一直未提交,且多次进行查询该条数据,而且发现该条数据结果不一样。(更新)

换句话说就是:在一个事务中,两次查询的结果不一致,查询的记录数一致

幻读:事务B根据某些条件进行查询但是一直不提交;此时事务A像添加或删除相同条件下的数据并进行提交;此时事务B

多次查询的数据数量不一样。(添加或则删除)

换句话说:在一个事务中,多次查询的结果不一致,指查询的记录数不一致

read uncommitted  读未提交  脏读,不可重复读,幻读都会出现

read committed 读已提交,可以避免脏读

repeatable read 可重复读,可以避免脏读和不可重复读

serializable 串行化,可以避免所有问题

起初隔离级别为read uncommitted 读未提交;a,b两个会话,分别开启两个事务,然后a向b转了500元钱,但a未提交该事务, 
此时b查看,发现多了500.然后a回滚事务,b再查看账户,发现根本就没有多500.这便是脏读。 
脏读便是可以读取到另一个事务尚未提交的数据。 
如果我们此时将隔离级别提升为read committed 读已提交,便可避免脏读。同样b两个会话,分别开启两个事务,然后a向b转了500元钱, 
但a未提交该事务,此时b查看,依旧是原钱数. 
但此时,如果a 提交事务,b再去查看,发现此时多了500,对b而言,在一个事务中,两次查询的结果不一致,这便是不可重复读。 
如果我们此时将隔离级别提升为repeatable read 可重复读,可以避免脏读和不可重复读的发生。同样a 提交事务,b再去查看,发现 
依旧是原钱数,b只能结束当前事务,在开启一个新事务,才能查询到数据的变化,这al便避免了不可重复读。 

如果我们设置了seriizable串行化,就相当于锁表,某一时间内只允许一个事务访问该表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值