学习来源:https://blog.csdn.net/qq_33290787/article/details/51924963
一:事务的四种隔离级别
大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle,PG。Mysql的默认隔离级别是Repeatable read。事务隔离级别越高,性能越低
1.Read uncommitted 读未提交
顾名思义其实就是可以读取他人还未提交的数据,举个例子:在一个事务中,首先我男朋友给我打了两块钱,然后我看到我银行卡上多了两块钱,感到万分激动,终于出血给我红包了,然后他立马发觉了不对,赶紧会滚了这条还未提交的事务,一分钱没给我
读未提交其实就是我看到了其他人还未提交的事务的数据,这就是脏读
解决这种情况就是 读提交
2.Read committed 读提交
顾名思义就是一个事务要等另一个事务提交后才能读取数据, 举个例子:我拿着我男朋友的卡去买口红,在我刷卡的时候查询到卡里还有200块,还可以买一只MAC,但是就在这时,我男朋友怕我花钱把钱都转出去(当然他操作的时候一定是在售货员帮我查询金额后扣款前发生的),然后尴尬的事情出现了,售货员再扣款的时候发现钱不够了.......
这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。
3.Repeatable read 重复读
顾名思义就是在开始读取数据(事务开启)时,不再允许修改操作,举个例子:上面的例子,其实就是在我刷卡的时候,在刚开始查询余额时,就开启事务,不允许其他事务的UPDATE修改操作,他也不能把钱转走,这样就可以付款了
重复读可以解决不可重复读问题,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
幻读:当我想看下我男朋友的消费清单时,查询时显示2k,但当我打印清单时,他在此时也不知道给哪个小姑娘花了一千块,消费清单打印出来的时候是1.2w,吓得我以为是个鬼故事,这就是幻读
4.Serializable 序列化
可避免脏读、不可重复读、幻读的发生。
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行。
二:事务的四个基本要素
ACID
一个支持事务的数据库系统,一定支持的四种特性:原子性,隔离性,一致性,持久性
原子性:要么都执行,要么都不执行
隔离型:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离
网友评论