锁
半张饭卡
北漂一族
展开
-
mysql 之死锁问题
一、死锁死锁,是指两个或两个以上的食物在执行过程中,因锁资源而造成的一种互相等待的现象。若无外力作用,事物都将无法推进下去。解决随所问题的方法:超时,即两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。wait-for graph(等待图)的方式进行死锁检测。二、wait-for graphwait-for graph要求数据库保存两种信息:锁的信息链表和事务等待链表。通过这两类链表可一构造出一张图。若这个图中存在回路,就代表存在死锁原创 2020-12-10 17:21:23 · 475 阅读 · 1 评论 -
mysql事务的隔离级别
一、读未提交(READ UNCOMMITTED)在这种隔离级别下,事务都能读取到其他事务未提交的数据,会造成脏读。二、读已提交(READ COMMITTED)在这种隔离级别下,事务只能读取到其他事务已经提交的内容。能够解决脏读的现象,但是会造成不可重复读。三、可重复读(REPEATABLE READ)在这种隔离级别下, 事务前后多次的读取到的数据内容是不变的。能够解决不可重复读。mysql的可重复读,使用间隙锁(Gap Lock)的方式可以解决幻读的问题。四、可串行化(Serializable原创 2020-12-10 15:14:22 · 130 阅读 · 0 评论 -
脏读、不可重复读、幻读
脏读、不可重复读、幻读脏读,事务T1第二次读取时,读到了事务T2未提交的数据,这时,T2回滚,T1读取到的是脏数据。不可重复读,事务T1第二次读取时,读到了事务T2已提交的数据,T1前后两次读取的数据内容不一致。不可重复读和脏读的区别:脏读是读取到未提交的数据,而不可重复读,读到的是已经提交的数据。脏读违反了数据库事务隔离性,不可重复读违反的是事务一致性的要求。幻读,与不可重复读一样,也是读取到了事务T2已提交的数据。幻读与不可重复读的区别:不可重复读,事务T1第二次读取与第原创 2020-12-10 14:58:24 · 229 阅读 · 0 评论 -
Phantom Problem(幻读)问题
Phantom Problem是指同一事务下,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在的行。在默认的事务隔离级别下,即REPEATABLE READ下,InnoDB存储引擎采用Next-Key Locking机制来避免Phantom Problem(幻读问题)。举个栗子:创建测试表t:CREATE TABLE t (a INT PRIMARY KEY);INSERT INTO t SELECT 1;INSERT INTO t SELECT 2;INS原创 2020-12-09 16:47:24 · 2219 阅读 · 6 评论 -
一致性非锁定读与一致性锁定读
一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过 行多版本控制(multi versioning)的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行DELETE或UPDATE操作,这时读取操作不会因此去等待行上锁的释放,相反地,InnoDB存储引擎会去读取行的一个快照数据。如图,直观地展现了InnoDB存储引擎一致性的非锁定读。之所以称其为非锁定读,因为不需要等待访问的行上X锁的释放。快照数据是指该行的之前版本的数据,该是先是通过undo段来原创 2020-12-07 16:17:17 · 340 阅读 · 0 评论 -
lock与latch区别
lock与latch区别latch一般称为闩锁(轻量级锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB存储引擎中,latch又分为mutex(互斥锁)和rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。此外,lock,正如在大多数数据库中一样,原创 2020-12-07 10:31:38 · 4303 阅读 · 8 评论