如果没有锁,mysql会出现什么情况呢?
线程A正在向一条记录中写入数据,假设这条记录共10个字段,当写到3个字段时,线程B要过来取出这条数据,会出现什么情况呢? 线程B读取的数据是前3个字段的新值 + 后7个字段的旧值,这肯定是不行的,用户读取的数据都乱套了,以新闻为例:标题读取的是新的,而内容读取的是旧的,不说别的,用户自己就得笑掉大牙
mysql中的事物就是用锁实现的,根据隔离级别不同决定了使用锁的“狠度”不同
备份时为什么加锁?
正在备份第10条记录,突然有线程过来修改了这条记录,极有可能造成备份的数据中,这条记录一部分是新值,一部分是旧值,原因同上
只是个人的理解,有不对的地方请指教
背景
数据库的锁是在多线程高并发的情况下用来保证数据稳定性和一致性的一种机制。MySQL 根据底层存储引擎的不同,锁的支持粒度和实现机制也不同。MyISAM 只支持表锁,InnoDB 支持行锁和表锁。目前 MySQL 默认的存储引擎是 InnoDB,这里主要介绍 InnoDB 的锁。
使用 InnoDB 的两大优点:一是支持事务;二是支持行锁。
在高并发的情况下事务的并发处理会带来几个问题
由于高并发事务带来这几个问题,所以就产生了事务的隔离级别
举个例子
按照上面 1,2,3,4 的顺序执行会发现第 4 步被阻塞了,必须执行完第 5 步后才能插入成功。这里我们会很奇怪明明锁住的是uid=6 的这一行,为什么不能插入 5 呢?原因就是这里采用了 next-key 的算法,锁住的是(3,10)整个区间。感兴趣的可以试一下。
今天给大家分享了一下 MySQL 的 InnoDB 的事务以及锁的一些知识,通过自己的实际上手实践对这块更加熟悉了,希望大家在看的时候也可以动手试试,这样更能体会,理解的更深刻。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)