天天看点

MySQL第33课~并发和锁定Concurrency and Locking

作者:小饼干笔记

所有内容收录在合集~MySQL入门到熟练。欢迎点赞关注我哦~

之前的32节课程,我们都是模拟的自己和自己玩的场景,是唯一的用户。实际的工作中,不会确定有几个人一起同时访问数据。这就是

并发 Concurrency

一个用户在搜索问题时,修改数据时,其他人可能也在。。。

并发是个问题,试试将他最小化。

先从2个人开始,假设小一和小二,都想给数据做调整,可能是金额,积分,或者随便什么

第一步,建立2个服务器连接,没错,就是上方那个Local instance

现在我建立了2个了,独立的连接。

MySQL第33课~并发和锁定Concurrency and Locking

然后就用顾客积分,五一到了,我一激动想给第一个人送200积分,先写一串,然后不执行,直接复制到另一个服务器

然后执行的时候会发现,不能同时,第一个完成才能执行第二个

MySQL第33课~并发和锁定Concurrency and Locking

这个时候不用担心反复添加,再反复添加,让积分一下暴富,瞬间增加超多的积分

正常情况下,前后执行,得到不同的积分结果,从2273变为2873

MySQL第33课~并发和锁定Concurrency and Locking

但是,俗话说的好,不出意外的话,就要出意外了。意外有以下几种:

1 丢失更新 Lost Updates

如果事务之间冲突,且没有上锁时,就会发生这种情况。较晚提交的数据会覆盖前面的数据,导致数据奇怪,也就是确实了一部分数据。

假设两个数据都想修改数据,一个增加数据,一个想更改电话号码或者地址,同时发生,为了避免出意外,MySQL会使用锁,从而避免同时更改,出现错误。

2 脏读 Dirty Reads

一个事务读了尚未被提交的数据,比如有人修改了一笔订单,但是还没提交更新,另外一个人也读取了数据,并且进行了调整。经过一系列操作,最后导致错误结果。

这个时候可以建立隔离。

有4个事务隔离级别,比如READ COMMITTED 事务只能读取已提交的数据。

如果事务完成之后数据有修改,则不会有影响。重要的是读到的任何数据,在读取的时候都是已经提交的数据。

3 不可重复读 Non Repeating Reads

读取了数据2次,结果不一样,,,

一次看到顾客的客单价是999,然后这个时候,客单价更新了,不管是多少,

第二次读的时候就不一样,那么这个时候不可重复读或者不一致读,会有效果。

当然一般默认根据最新信息做决定。毕竟时间早的话,业务部门的数据也是一直改变的。

4 幻读 phantom reads

比如想给达成一定金额的人一个积分返利,这期间也有其他的成交金额达到了这个值,但是没有查询返回,就遗漏了这部分人。

这就是幻取,导致一部分人变成了幽灵人。这个时候需要用序列表来解决问题。对应的条件是,拥有的客户和并发的事务越多,需要的时间越长。

总结:

隔离级别会损害性能和可拓展性,因此,只有在有必要防止幻读的情况下才可以使用这个

一次说这些很抽象,后面的课程会具体展开。

继续阅读