事务四大隔离级别
脏读解决方法:RC(read committed),并且默认就好,数据库默认状态已经解决
可重复读和幻读解决方法是:间歇锁
数据库默认隔离级别: mysql ---repeatable + MVCC多版本实现, oracle,sql server ---read commited
四个隔离级别:
MYSQL数据库的四种隔离级别_张Fuliang的博客-CSDN博客_mysql数据库的隔离级别
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
mysql数据库锁有哪些
https://www.php.cn/mysql-tutorials-418309.html后期更新。等待后续
java锁有哪些
1、可重入锁:可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。例如
当线程已经获取第二个synchronized,再次循环也会获取到该锁,所以称之为可重入锁
可重入锁有synchronized和ReentrantLock
2、自旋锁:是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU
自旋锁有CAS
3、公平锁和非公平锁
公平锁:是指多个线程按照申请锁的顺序来获取锁。
非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。
对于Java ReentrantLock
而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。
对于Synchronized
而言,也是一种非公平锁。由于其并不像ReentrantLock
是通过AQS的来实现线程调度,所以并没有任何办法使其变成公平锁
// 非公平锁 Lock lock = new ReentrantLock();
// 公平锁 Lock lock = new ReentrantLock(true);
4、偏向锁、轻量级锁、重量级锁
偏向锁:是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。
轻量级锁:是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
重量级锁:是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低。
- 与轻量级锁的区别:轻量级锁是在无竞争的情况下使用CAS操作来代替互斥量的使用,从而实现同步;而偏向锁是在无竞争的情况下完全取消同步。
- 与轻量级锁的相同点:它们都是乐观锁,都认为同步期间不会有其他线程竞争锁。
- 原理:当线程请求到锁对象后,将锁对象的状态标志位改为01,即偏向模式。然后使用CAS操作将线程的ID记录在锁对象的Mark Word中。以后该线程可以直接进入同步块,连CAS操作都不需要。但是,一旦有第二条线程需要竞争锁,那么偏向模式立即结束,进入轻量级锁的状态。
5、间歇锁
思想是:锁的是索引叶子节点的next指针。
解决问题是:解决了mysql RR级别下是幻读的问题
锁的范围:
begin;
select * from z where id=4 for update;
会锁住主键索引叶子节点的3的next指针。(为啥呢,需要你自己画主键索引的图)
begin;
select * from z where id=3 for update;
间隙锁会退化为行锁只锁叶子节点3 ,为什么因为没必要。不加间隙锁也不会打破上述的红色4个条件。
begin;
select * from z where id>4 for update;
叶子节点3及之后所有节点会加行锁并且他们的next指针会加锁,
begin;
select * from z where c=2 for update;
会发生锁表,因为c没有索引结构能存储行锁或者间隙锁。