关系型数据库-锁

来源:互联网 发布:编程框架是什么意思 编辑:程序博客网 时间:2024/06/10 21:12
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库就会产生多个事务同时存取同一数据的情况。若并发操作不加控制就可能会读取和 存储不正确的数据,破坏数据的一致性(读脏,不可重复读,幻读等),还可能产生死锁,为解决这个问题,加锁是非常必要的技术,对实现数据库并发控制是一个好的方案。
锁包括:行级锁,表级锁,悲观锁,乐观锁

行级锁
一种它锁,防止另外事务修改此行;在使用以下语句是,某些数据库会自动应用行级锁:INSERT,UPDATE,DELETE,SELECT....FOR UPDATE[OF COLUMNS][WAIT N|NOWAIT];SELECT...FOR UPDATE 语句允许用户一次锁定多条记录进行更新。使用commit或者rollback来释放锁。Mysql的innodb存储引擎默认行级锁。特点:开锁大,加锁慢,会出现死锁,锁定粒度最小(锁粒度大小就是锁的范围),发生锁冲突的概率最低,并发度最高。适合有大量按索引更新少量不同数据,同时又有并发查询的应用,像一些在线事务处理系统

表级锁
表级锁有5种类型
行共享:
禁止排他锁定表,与行排他类似,区别是别的事务还可以在此表上加任何排他锁。
行排他:
禁止使用排他锁和共享锁其他事务依然可以并发地对相同数据表进行查询,插入,更新,删除操作,或对表内数据行加锁操作,但不能有其他的排他锁
共享锁:
又叫读锁,表示如果事务对数据对象加了共享锁之后,其他事务可以对该数据对象加共享锁,但不能加排他锁,获准的事务只能对数据对象读取数据,不能修改数据
共享行排他:
比共享锁更多的限制,禁止使用共享锁及更多的锁,在表没有任何的DML操作时,只有一个事务可以加锁,可以更新。
排他锁:
一种基本的锁类型,又叫写锁,独占锁,表示如果一个事务对数据对象加了排他锁后,其他的事务不能再对这个表添加任何一种锁,直到该事物对改数据对象释放锁,该事物可以对数据对象读取,修改
悲观锁
Pessimistic Lock正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守悲观态度,事务每次去操作数据的时候都假设有其他事务会修改需要访问的数据,所以在访问之前都要求上锁,行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,因此,在整个数据处理过程中,将数据处于锁定状态

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