- 博客(7)
- 收藏
- 关注
原创 MySQL InnoDB的锁机制
如果表中不存在这行记录,假设表中有数据0,5,10,那么会在(5,10)的范围内加间隙锁(GAP LOCK)。范围查询语句select * from t where id > 7,假设表中数据有0,5,10,那么会在(5,10]的范围内加临键锁(Next Key Lock),注意临键锁的范围是左开右闭的。为啥要有意向锁,假设事务A已经对某行加了行级排他锁,此时事务B想要加表级锁修改数据,如果没有表级别的意向锁,事务B只能逐行判断是否加了行级锁,如果有则需要等待,效率太低。update xxx 会加X锁。
2024-08-08 19:58:42 196 1
原创 MVCC机制的原理
也就是说,每条数据的每次操作,都会形成一条undolog数据,这些数据根据时间关系就形成了一条链表。因为读-读并发不会产生问题,写-写并发通过加锁实现,读-写并发场景下会产生诸如脏读、不可重复读、幻读等问题。每创建一个事务的时候,就会随事务创建对应的readView视图。经历以上比较,如果数据不可见,那么就顺着undolog的链表,取上一个版本的数据,用上个版本的。基于上述的数据结构,MVCC为每个事务的select操作找到对应的数据版本。(回滚指针,指向上个版本的数据,一条数据通过该指针形成链表)。
2024-08-05 18:07:26 201
原创 mysql为什么使用RR(REPEATABLE READ)作为默认事务隔离机制
statement格式有个问题,举个例子,采用RC的隔离级别,两个事务A、B,A事务执行删除小于100的行,B事务执行插入一条值为90的行。2 MySQL的RR隔离机制,使用了间隙锁(GAP Lock),配合MVCC机制可以在一定程度上避免幻读(如果要完全解决幻读的问题,还是需要使用Serializable)。而如果使用RR的隔离级别,A会在更新数据的时候加间隙锁(GAP Lock)和临键锁(Next Key Lock),事务B会等待A提交或者回滚完成之后再执行,就解决了这个问题。
2024-08-05 14:43:10 356
原创 wait和notify机制
sleep是线程Thread类提供的方法,与wait不同的是,sleep方法不会释放锁,线程调用sleep方法后进入time-waiting状态。sleep之后,线程不需要被其他线程唤醒,当指定时间过后,一旦获取到cpu,就可以继续执行。在获取到锁的线程中,使用锁对象调用notify方法,会随机唤醒一个waiting状态的线程;notifyAll方法类似,会唤醒所有进入waiting状态的线程。,wait和notify才能搭配使用,否则没有意义。在获取到锁的线程中,使用锁对象调用wait方法会。
2024-05-24 15:35:57 168 1
原创 mysql的两阶段提交
先说背景,为什么要有两阶段提交?这里就要对mysql中的以下几个文件有所了解,undolog、redolog、binlog。undolog主要是在更新记录之前,存储更新前的值,方便回滚;redolog主要记录更新之后的值,如果mysql崩溃,可以从redolog中恢复数据;binlog主要用于主从之间同步,从库通过binlog同步主库的数据。两阶段提交主要和redolog和binlog有关。
2024-02-21 18:02:19 1321
原创 JAVA垃圾回收机制
在CMS和G1出现之前,所有垃圾收集器都是需要STW的。但是这样简单地划分还存在一个问题:在进行minorGC的时候,老年代的对象可能会引用新生代的对象,要确定新生代的对象是否应该被清除,需要在固定的GC Roots之外,再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性,这无疑是成本很大的。,即对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类的实例,并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身。
2023-07-26 18:44:52 887 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人