《周志明的软件架构课》学习笔记 Day8

1.主动学习

本地事务如何实现隔离性

隔离性

隔离性保证了每个事务各自读、写的数据互相独立,不会彼此影响。只从定义上,我们就能感觉到隔离性肯定与并发密切相关。如果没有并发,所有事务全都是串行的,那就不需要任何隔离,或者说这样的访问具备了天然的隔离性。

事务加锁总结: 1、事务一定会对数据加锁(读锁,写锁,范围锁)。锁不一定都是排它的,但只要当前事务无法对数据加锁就意味着有并发的其它事务对该数据持有某种锁,当前事务就只能等待锁的释放。锁的释放一般情况下都是在事务结束(提交或回滚)时释放,也有的情况下是在语句执行完就释放(比如读已提交的事务隔离级别就是在select执行完后数据的读锁就被立刻释放) 2、写锁是对记录“精准”加锁并且是排它的,“精准”的意思就是只对符合条件的那些存在的记录加锁,排它的意思就是此时其它事务就无法再select、update和delete这些记录。但该条件内其它可以被insert的记录还是可以进行insert操作的;而范围锁是对记录进行“范围”加锁,也就是对符合条件的已经存在的那些记录以及在这个范围内可以被insert的那些记录(现在还不存在)进行加锁,此时其它锁不但无法对存在的这些记录做select、update和delete,在该范围内也无法进行insert操作。 3、写锁和范围锁都属于排它锁。写锁排它意味着对该数据并发的其它事务不能再添加写锁和读锁,但是可以添加范围锁。范围锁排它意味着不能再添加任何锁。范围锁等级最高 4、读锁属于共享锁。共享意味着对该记录可以并发创建多笔持有读锁的事务。这些事务都各自读取记录互不影响。 5、对数据添加了读锁就无法再添加写锁,但如果该记录只有一个事务且持有读锁那么该读锁可以升级为写锁。 6、一个事务可能包含读写等多种操,因此可能会持有多种锁。 7、事务隔离级别和锁的关系。串行化的隔离级别是说对事务中的数据要添加读、写、范围锁(具体是哪些数据添加读锁、写锁或范围锁那要看sql语句,比如select就添加读锁)。在这种隔离级别下,一个事务如果正处于某些数据的读取操作那么其它事务是可以同时读取这些数据的,因此千万不要以为串行化就一定不存在事务的并发执行;可重复读的隔离级别是说事务中的数据添加了读锁和写锁,特别强调的是这个读锁要一直等到事务结束时才释放。另外要强调的是没有了范围锁,因此“可重复读”是指“对于上一次读取出来的数据是可以再次读取并且内容没发生改变”,暗含着“上一次没有读取出来这一次会读取出来的新增的数据”,也就是所谓的幻读;读已提交隔离级别是说事务中的数据仍然是添加了读锁和写锁,但是读锁释放的很快,select语句结束后就释放。

本地事务的四种隔离级别

可串行化
可重复读
读已提交
读未提交

备注

摘自极客时间 - 周志明老师的公开课《周志明的软件架构课》 <- 极其推荐大家阅读~>

2. 写在最后

隔离级别:

RED UNCOMMITTED(未提交读)
在RED UNCOMMITTED级别,事务中的修改,即使没提交,对其他事务也是可见的。事务可以读取未提交的数据,这被称为“脏读”(Dirty Read),因为读取的很可能是中间过程的脏数据,而不是最终数据。

RED COMMITTED(提交读)
大多数数据库系统默认的隔离级别都是RED COMMITTED,但是MYSQL不是。RED COMMITTED说的是,一个事务只能读到其他事务已经提交的数据,所以叫提交读。这个事务级别也叫做不可重复读(nonrepeatableread),因为两次同样的查询,可能会得到不同的结果。

REPEATABLE READ(可重复读)
REPEATABLE READ解决了脏读的问题。该级别保证了在同一事务中多次读取同样的记录结果是一致的。但是无法解决幻读的问题,所谓幻读,指的是当某个事务再读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围内的记录时,发现多了一行,会产生幻行。

SERIALIZABLE(可串行化)
SERIALIZABLE是最高级别的隔离。它通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,SERIALIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。

MVCC是一种读取优化策略,它在读取时不需要加锁的情况下,实现了提交读和可重复读的隔离级别。
可重复读:总是读在事务启动前就已经提交完成的数据。
提交读:总是读已经提交完成的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值