硬锁有两种,共享锁和排它锁;
死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象。
串行化是指将对象的状态转换成可以存储、传送的形式的过程
数据库遵循两段锁协议,将事务分成两个阶段,分别为:
在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁(共享锁,其它事务可以继续加共享锁,但不能加排它锁),在进行写操作之前要申请并获得X锁(排它锁,其它事务不能再获得任何锁)。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。
当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。
两个概念:悲观锁、乐观锁;
悲观锁:
对数据被外界修改持保守态度,也就是S锁、X锁这样的硬锁如果采用这种方式的话,为了保持事务隔离性,读取修改和删除都需要加锁;
乐观锁:
也就是MVCC,对数据被外界修改持开放态度,并不抗拒于外界数据的改变,而是通过版本号的对照来实现事务的隔离性,实质上并不算是锁,但能和锁发挥一样的功能;
快照读:
读历史数据。InnoDB中事务的select操作就是用的快照读,之前说到过当数据更新后MVCC为了保持可重复读的隔离等级会回滚到历史记录快照读会导致读取的数据过期等问题;
当前读:
读取的是最新版本数据,也就是insert、update、delete,当我们执行这三个操作时实际上数据库中的数据已经是过期的了,我们进行更新的才是最新的;
可重复读中的读锁通过MVCC实现,而写锁则通过next-key lock实现;
四种隔离等级的加锁方式各有长短,具体怎么加视情况而定;
吃水不忘挖井人:https://blog.csdn.net/qq_35246620/article/details/61200815