所有内容收录在合集~MySQL入门到熟练。欢迎点赞关注我哦~
之前的32节课程,我们都是模拟的自己和自己玩的场景,是唯一的用户。实际的工作中,不会确定有几个人一起同时访问数据。这就是
并发 Concurrency
一个用户在搜索问题时,修改数据时,其他人可能也在。。。
并发是个问题,试试将他最小化。
先从2个人开始,假设小一和小二,都想给数据做调整,可能是金额,积分,或者随便什么
第一步,建立2个服务器连接,没错,就是上方那个Local instance
现在我建立了2个了,独立的连接。
然后就用顾客积分,五一到了,我一激动想给第一个人送200积分,先写一串,然后不执行,直接复制到另一个服务器
然后执行的时候会发现,不能同时,第一个完成才能执行第二个
这个时候不用担心反复添加,再反复添加,让积分一下暴富,瞬间增加超多的积分
正常情况下,前后执行,得到不同的积分结果,从2273变为2873
但是,俗话说的好,不出意外的话,就要出意外了。意外有以下几种:
1 丢失更新 Lost Updates
如果事务之间冲突,且没有上锁时,就会发生这种情况。较晚提交的数据会覆盖前面的数据,导致数据奇怪,也就是确实了一部分数据。
假设两个数据都想修改数据,一个增加数据,一个想更改电话号码或者地址,同时发生,为了避免出意外,MySQL会使用锁,从而避免同时更改,出现错误。
2 脏读 Dirty Reads
一个事务读了尚未被提交的数据,比如有人修改了一笔订单,但是还没提交更新,另外一个人也读取了数据,并且进行了调整。经过一系列操作,最后导致错误结果。
这个时候可以建立隔离。
有4个事务隔离级别,比如READ COMMITTED 事务只能读取已提交的数据。
如果事务完成之后数据有修改,则不会有影响。重要的是读到的任何数据,在读取的时候都是已经提交的数据。
3 不可重复读 Non Repeating Reads
读取了数据2次,结果不一样,,,
一次看到顾客的客单价是999,然后这个时候,客单价更新了,不管是多少,
第二次读的时候就不一样,那么这个时候不可重复读或者不一致读,会有效果。
当然一般默认根据最新信息做决定。毕竟时间早的话,业务部门的数据也是一直改变的。
4 幻读 phantom reads
比如想给达成一定金额的人一个积分返利,这期间也有其他的成交金额达到了这个值,但是没有查询返回,就遗漏了这部分人。
这就是幻取,导致一部分人变成了幽灵人。这个时候需要用序列表来解决问题。对应的条件是,拥有的客户和并发的事务越多,需要的时间越长。
总结:
隔离级别会损害性能和可拓展性,因此,只有在有必要防止幻读的情况下才可以使用这个
一次说这些很抽象,后面的课程会具体展开。