摘要: 并发的问题就可能出现死锁,在MySQL中同样也有死锁的问题。一般MySQL通过回滚能解决不少死锁的问题,但是死锁是无法完全避免的,可以通过一些方法来尽量减少死锁: 第一, 以固定的顺序访问表和行。比如对两个job批量进行更新,可以对id列表先排序,后执行,这样就避免了交叉等待锁的情形;将两个事务的S 阅读全文
posted @ 2021-02-03 20:18 Eleanor123 阅读(58) 评论(0) 推荐(1) 编辑
摘要: 当用范围条件检索数据而不是相等条件检索数据,并请求共享或排他锁是,InnoDB会给符合范围条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫做间隙。InnoDB也会对这个间隙进行加锁,这种锁机制就是间隙锁。 间隙锁只会在Repeatable read隔离级别下使用,例如test表 阅读全文
posted @ 2021-02-03 20:15 Eleanor123 阅读(137) 评论(0) 推荐(1) 编辑
摘要: 乐观锁是一种思想,具体实现是表中有一个版本字段,第一次读的时候获取到这个字段。处理完业务逻辑开始更新的时候,需要再次查看该字段的值是否和第一次一样。如果一样更新,反之不更新。为什么叫乐观,原因是这个模式没有从数据库加锁,等到更新的时候再判断是否可以更新。 悲观锁是数据库成名加锁,都会阻塞去等待锁。 阅读全文
posted @ 2021-02-03 20:14 Eleanor123 阅读(69) 评论(0) 推荐(1) 编辑
摘要: 数据库事务有不同的隔离级别,不同的隔离级别对锁的使用是不同的,锁的应用最终导致不同事务的隔离级别。MVCC(Multi-Version Concurrency Control)多版本并发控制,MVCC就是行级锁的一个升级。 事务的隔离级别是通过锁的机制来实现的,只不过隐藏了加锁细节。 表锁中读写是阻 阅读全文
posted @ 2021-02-03 20:11 Eleanor123 阅读(467) 评论(0) 推荐(1) 编辑
摘要: MySQL一般使用的是InnoDB存储引擎。InnoDB和MyISAM有两个本质区别:InnoDB支持行锁、事务。表锁是默认的,即使InnoDB不走索引,加的表锁是自动挡。InnoDB比较重要的一个特性就是支持行锁。InnoDB提供了两种类型的行锁: 共享锁(S锁):允许一个事务去读一行,阻止其他事 阅读全文
posted @ 2021-02-03 20:10 Eleanor123 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 锁分为表锁和行锁: 表锁开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度低。 行锁开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。 不同的存储引擎支持的锁粒度不一样。InnoDB行锁和表锁都支持,MyISAM只支持表锁。InnoDB只有通过索引条件检索数据才使 阅读全文
posted @ 2021-02-03 20:08 Eleanor123 阅读(322) 评论(0) 推荐(0) 编辑