启迪网站建设招聘,企业查询天眼查官网,用自己照片做衣服 杯子的是哪个网站,泗阳城乡建设局网站1.锁的分类
1.1.按锁粒度划分 表锁#xff1a;开销小#xff0c;加锁快#xff1b;锁定力度大#xff0c;发生锁冲突概率高#xff0c;并发度最低;不会出现死锁。 行锁#xff1a;开销大#xff0c;加锁慢#xff1b;会出现死锁#xff1b;锁定粒度小#xff0c;发生…1.锁的分类1.1.按锁粒度划分表锁开销小加锁快锁定力度大发生锁冲突概率高并发度最低;不会出现死锁。行锁开销大加锁慢会出现死锁锁定粒度小发生锁冲突的概率低并发度高。页锁开销和加锁速度介于表锁和行锁之间会出现死锁锁定粒度介于表锁和行锁之间并发度一般1.2.按兼容性划分共享锁S Lock,也叫读锁read lock相互不阻塞。排他锁X Lock也叫写锁write lock排它锁是阻塞的在一定时间内只有一个请求能执行写入并阻止其它锁读取正在写入的数据。1.3.按加锁机制划分①乐观锁乐观锁基于这样的假设冲突在系统中出现的频率较低因此在数据库事务执行过程中不会频繁地去锁定资源。相反它在提交更新的时候才检查是否有其他事务已经修改了数据。可以通过在数据表中使用版本号Version或时间戳Timestamp来实现每次读取记录时同时获取版本号或时间戳更新时检查版本号或时间戳是否发生变化。如果没有变化则执行更新并增加版本号或更新时间戳如果检测到冲突即版本号或时间戳与之前读取的不同则拒绝更新。②悲观锁悲观锁假设冲突是常见的因此在数据处理过程中它会主动锁定数据防止其他事务进行修改。可以直接使用数据库的锁机制如行锁或表锁来锁定被访问的数据。常见的实现是 SELECT FOR UPDATE 语句它在读取数据时就加上了锁直到当前事务提交或回滚后才释放。2.InnoDB行锁的实现2.1.记录锁Record Lock 记录锁记录锁就是直接锁定某行记录。当我们使用唯一性的索引(包括唯一索引和聚簇索引)进行等值查询且精准匹配到一条记录时此时就会直接将这条记录锁定。2.2.间隙锁间隙锁(Gap Locks) 的间隙指的是两个记录之间逻辑上尚未填入数据的部分,是一个左开右开空间。间隙锁就是锁定某些间隙区间的。当我们使用用等值查询或者范围查询并且没有命中任何一个record此时就会将对应的间隙区间锁定。2.3.临键锁临键指的是间隙加上它右边的记录组成的左开右闭区间。临键锁就是记录锁(Record Locks)和间隙锁(Gap Locks)的结合即除了锁住记录本身还要再锁住索引之间的间隙。当我们使用范围查询并且命中了部分record记录此时锁住的就是临键区间。临键锁锁住的区间会包含最后一个 record 的右边的临键区间。当使用唯一性索引等值查询匹配到一条记录的时候临键锁(Next-Key Locks)会退化成记录锁没有匹配到任何记录的时候退化成间隙锁。3.意向锁意向锁是一个表级锁不要和插入意向锁搞混。意向锁的出现是为了支持 InnoDB 的多粒度锁它解决的是表锁和行锁共存的问题。当我们需要给一个表加表锁的时候我们需要根据去判断表中有没有数据行被锁定以确定是否能加成功。假如没有意向锁那么我们就得遍历表中所有数据行来判断有没有行锁有了意向锁这个表级锁之后则我们直接判断一次就知道表中是否有数据行被锁定了。有了意向锁之后要执行的事务 A 在申请行锁写锁之前数据库会自动先给事务 A 申请表的意向排他锁。当事务 B 去申请表的互斥锁时就会失败因为表上有意向排他锁之后事务 B 申请表的互斥锁时会被阻塞。4.排查死锁排查死锁的一般步骤是这样的1查看死锁日志 show engine innodb status;------------------------LATEST DETECTED DEADLOCK------------------------2019-07-21 12:34:56 0x7f89c000a700*** (1) TRANSACTION:TRANSACTION 123456, ACTIVE 10 sec insertingmysql tables in use 1, locked 1LOCK WAIT 7 lock struct(s), heap size 1248, 0 row lock(s), undo log entries 6MySQL thread id 12345, OS thread handle 140347674319872, query id 9876547 localhost root updateUPDATE my_table SET col1 100 WHERE col2 value;*** (2) TRANSACTION:TRANSACTION 123457, ACTIVE 9 sec fetching rowsmysql tables in use 1, locked 17 lock struct(s), heap size 1248, 0 row lock(s), undo log entries 6MySQL thread id 12346, OS thread handle 140347674319873, query id 9876548 localhost root updateUPDATE my_table SET col1 200 WHERE col2 value;2找出死锁 sql3分析 sql 加锁情况4模拟死锁案发5分析死锁日志6分析死锁结果