浅谈数据库锁机制:(只是本人的一些了解,个人观点)

首先:需要明确锁的分类

锁包括行级锁、表级锁、悲观锁、乐观锁

首先行级锁:又叫排他锁,多见于支持高并发的数据库搜索引擎中出现使用,如mysql中的innodb默认是行级锁;在以下查询中oracle中会自动应用行级锁。释放行级锁时使用commit或者rollback释放

SELECT … FOR UPDATE;

特点:锁定粒度最小,发生锁冲突的概率最低,并发度也最高

表级锁又分为以下五种:

   行共享 (ROW SHARE) – 禁止排他锁定表,与行排他类似,区别是别的事务还可以在此表上加任何排他锁。(除排他(exclusive)外)
   行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁,其他事务依然可以并发地对相同数据表执行查询,插入,更新,删除操作,或对表内数据行加锁的操作,但不能有其他的排他锁(自身是可以的,没发现有什么用)
   共享锁(SHARE) - 锁定表,对记录只读不写,多个用户可以同时在同一个表上应用此锁,在表没有被任何DML操作时,多个事务都可加锁,但只有在仅一个事务加锁的情况下只有此事务才能对表更新;当表已经被更新或者指定要更新时(select for update),任何事务都不能加此锁了。
   共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁,在表没有被任何DML操作时,只有一个事务可以加锁,可以更新,书上说别的事务可以使用select for update锁定选中的数据行,可是实验后没被验证。

   排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表

行级锁支持高并发,但是锁的粒度细致,对系统的开销比较大,影响性能,也会出现死锁;表级锁不会出现死锁,但是并发时代价高。

悲观锁:事务每次去操作数据的时候都假设有其他事务会修改需要访问的数据,所以在访问之前都要求上锁,如:行锁,表锁,读锁,写锁等,都是在做操作之前先上锁,在整个数据处理过程中,数据将处于锁定状态。

乐观锁:访问之前不要求上锁,只是在进行更新修改操作的时候判断一下在访问的期间有没有其他人在修改数据。它适用于多读的应用类型,冲突真的发生比较少的时候就比较好,这样省去了开销的开销,可以提高吞吐量;但如果是真的经常要发生冲突的,那每次还要去判断进行retry,反倒降低的性能,这个时候悲欢锁比较好。数据库如果提供类似于write_condition机制的其实都是提供的乐观锁

猜你喜欢

转载自blog.csdn.net/weixin_38120374/article/details/80624396