数据库锁机制

2019.09.12 10:22

数据库在并发时会出现很多问题,但有些时候会提高程序的运行效率,而有些时候则会产生非常严重的BUG。数据库为了解决因并发而产生的问题,于是底层采用数据库锁的的机制来解决并发问题,也就是类似Java中的同步锁。虽然不同数据库的锁机制在底层可能是不同的,但是它们的实现原理都是一样的。下面我们看一下数据库锁机制的底层实现原理。

锁的分类

按照锁定的对象不同可以分为表锁定和行锁定。它们的区别是前者是对整个表锁定,而后者是对表中的特定行进行锁定。从并发事物锁定的关系上来分,可以分为共享锁定和独占锁定。它们的区别是共享锁定会防止独占锁定,但允许其它的共享锁定。而独占锁定既防止其它的独占锁定又防止其它的共享锁定。

应用场景

按照上面介绍的锁的分类如果我们要对数据库进行数据更改时也就是UPDATE,那么数据库必须在进行更改的行上添加独占锁定,只有这样才能保证数据库的数据安全。除此之外还有INSERT、DELETE等操作都会隐式的添加行锁定。下面我们已Oracle数据库为例子,来重点介绍一下数据库的锁定。

Oracle锁

行共享锁:可以通过SELECT FOR UPDATE语句隐式的获得行共享锁。在Oracle中也可以通过LOCK TABLE IN ROW SHARE MQDE 语句显式的获得行共享锁。行共享锁的特性是:它并不防止对数据行进行更改操作,但是它可以防止其它操作获取独占锁。行共享锁还允许进行多个并发的行共享和行独占性锁,并允许进行数据表的共享或采用共享行独占锁定。

行独占锁:可以通过INSERT、UPDATE和DELETE语句隐式的获取行独占锁,当然也可以直接通过LOCK TABLE IN ROW EXCLUSIVE MODE语句显式的获取行独占锁。行独占锁的特性是:它可以防止其它操作获取一个共享锁、共享独占锁或独占锁。

表共享锁:可以通过LOCK TABLE IN SHARE MODE显示获得。表共享锁的个特性是:它可以防止其它操作获取行独占锁或者防止其它表共享行独占锁或表独占锁,它允许在表中拥有多个行共享和表共享锁。该锁可以让会话具有对表事务级一致性访问,因为其它会话在用户提交或者回滚该事务并释放该表的锁之前不能更改这个被锁定的表。

表共享行独占:可以通过LOCK TABLE IN SHARE ROW EXCLUSIVE MODE语句获得。表共享行独占的特性是:它可以防止其它会话获取一个表共享、行独占或者表独占锁,它允许其它行共享锁。这种锁类似表共享锁,只是它一次只能对一个表放置一个表共享行独占锁定。例如:如果A会话拥有该锁,则B会话可以执行SELECT FOR UPDATE 操作,但如果B会话试图更新选择的行时,则需要等待。

表独占:可以通过LOCK TABLE IN EXCLUSIVE MODE 显示获得。表独占的特性是:它可以防止其它会话对该表的任何其它锁定。


吉林乌拉

0
0
评论
0

我要发表

热门课程推荐

博客专栏推荐

数据库升级笔记
免费 7篇/已完结

相关领域专家推荐