
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习Java编程开发等互联网技术,而本文我们就通过案例分析来简单了解一下,MySQL数据库基础知识分享。
1.资源的竞争方式
MySQL对资源的操作无非就是读、写两种方式,但是由于事务并发执行的存在,因此对同一资源的并发访问存在3种形式:
读—读:并发事务同时读取相同资源。由于读操作不会改变资源本身,因此这种情况下并不存在并发安全性问题。
读—写/写—读:一个事务对资源进行读操作,另一个事务对资源进行写操作。
写—写:并发事务同时对同一个资源进行写操作。
2.读—写/写—读下的问题
假设一种情形,一个事务先对某个资源进行读操作,然后另一个事务再对该资源进行写操作,如果两个事务到此为止,必然不会导致并发问题。
可是事务这种东西,一般情况下就是包含有很多个子操作啊。
2.1.幻读
想象一下啊,假设事务T1和T2并发执行,T1先查找了所有name为「王刚蛋」的用户信息,此时发现拥有这个硬汉名字的用户只有一个。然后T2插入了一个同样叫做「王刚蛋」的用户的信息,并且提交了。
2.2.不可重复读
再来,同样是T1和T2两个事务,T1通过id=1查询到了一条数据,然后T2紧接着UPDATE(DELETE也可以)了该条记录,不同的是,T2紧接着通过COMMIT提交了事务。
此时,T1再次执行相同的查询操作,会发现数据发生了变化,name字段由「王刚蛋」变成了「蝉沐风」。
如果一个事务读到了另一个已提交事务修改过的(或者是删除的)数据,而导致了前后两次读取的数据不一致的情况,这种事务并发问题叫做不可重复读。
2.3.脏读
事情还没结束,假设T1和T2都要访问user_innodb表中id为1的数据,不同的是T1先读取数据,紧接着T2修改了数据的name字段,需要注意的是,T2并没有提交!
此时,T1再次执行相同的查询操作,会发现数据发生了变化,name字段由「王刚蛋」变成了「蝉沐风」。
如果一个事务读到了另一个未提交事务修改过的数据,而导致了前后两次读取的数据不一致的情况,这种事务并发问题叫做脏读。
2.4.锁与MVCC的关系
总结一下:我们在读—写,写—读的情况下会遇到3种读不一致性的问题,脏读、不可重复读以及幻读。
那写—写呢?很显然,在不做任何措施的情况下,并发会出现更大的问题。那该怎么办呢?
一切的并发问题都可以通过串行化解决,但是串行化效率太低了!
再优化一下,一切并发问题都可以通过加锁来解决,这种方案我们称为基于锁的并发控制(LockBasesConcurrencyControl,LBCC)!但是在读多写少的环境下,客户端连读取几条记录都需要排队,效率还是太低了!
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。