postgresql锁

postgresql锁:

postgresql中有3种锁模式,分别为:自旋锁,lwlook和regularlock。


1,自旋锁自旋锁

,自旋锁使用互斥信息,与操作系统和硬件环境联系比较密切.spinlocky的主要特点是封锁的时间很短,没有等待队列和死锁检测机制。事务结束时,不能自动释放自旋锁锁。


2, LWLock轻量级锁

,LWLock主要提供对共享存储器的数据结构的互斥访问.LWLock的主要特点是由等待队列和无死锁检测。事务结束时,可以自动释放lwlock.lwlock可分为排他模式和共享模式。

,排他模式:用于数据修改操作,例如:插入、更新或删除,确保不会同时对同一资源进行多重更新。

,共享模式:用于读取数据操作,允许多个事务读取相同的数据,但不允许其他事务修改当前数据,如选择语句。


3, regularlock常规锁

, regularlock为一般数据库事务管理中所指的锁.regularlock的主要特点为有等待队列,有死锁检测和能自动释放锁。

, regularlock支持的锁的模式有8种,按排他级别从低到高分别是:访问共享,行,行独家,独家分享更新,分享,分享行独家,独家,独家访问;

,①:访问共享(访问共享锁):查询命令(选择)将会在查询的表上获取访问共享锁。一般任何一个对表上的只读查询操作都将获取这种类型的锁。此模式的锁和访问独家(访问排他锁)是冲突的。

,②:行分享(行共享锁):使用“选择更新”或“选择分享”命令将获得行共享锁。另外,此锁和独家(排他锁)和访问独家(访问排他锁)是冲突的。

,③:独家行(行排他锁):使用更新、删除或插入命令会在目标表上获得行排他锁,并且在其他被引用的表上加共享锁上访问。一般,更改表数据的命令都将在这张表上获得行排他锁。另外,此锁和共享(共享锁),分享行独家(共享行排他锁),独家(排他锁)和访问独家(访问排他锁)是冲突的。

,④:分享更新独家(共享更新排他锁):使用真空(不带全部选项)分析或创建索引同时语句时使用共享更新排他锁。

,⑤:分享(共享锁):使用创建索引(不带同时选项)语句请求时用共享锁。

,⑥:分享行独家(共享行排他锁):和排他锁类似,但是允许行共享。

,⑦:独家(排他锁):阻塞行共享和选择更新时使用排他锁。

,⑧:访问独家(访问排他锁):alter table,删除表,截断,重建索引,集群或真空全命令会获得访问排他锁。在锁表命令中,如果没有生命其他模式,获得独家就是默认模式。


5,死锁:

,在两个或多个任务中,如果每个任务锁定了其他任务视图锁定的资源,就会造成这些任务永久阻塞,从而出现死锁。此时系统处于死锁状态。


形成死锁的4个必要条件:

①:请求与保持条件:获取资源的进程可以同时申请新的资源。

②:非剥夺条件:已经分配的资源不能从该进程中剥夺。

③:循环等待条件:多个进程构成环路,并且每个进程都在等待相邻进程正占用的资源。

④:互斥条件:资源只能被一个进程使用。


减少死锁的方法:

①:在所有事务中都以相同的次序使用资源。

②:使事务尽可能简单并在一个批处理中。

③:为死锁超时参数设置一个合理范围,如3-30分钟,超时则自动放弃本操作,避免进程挂起。

④:避免在事务内核用户进行交互,减少资源的锁定时间。

⑤:使用较低的隔离级别,相比较高的隔离级别能够有效减少持有共享锁的时间,减少锁之间的竞争。


例子:

——:使用命令锁定一个表,语法如下:

, lock (表),name [,……][lockmode模式][nowait]

,其中,名称为要锁定的现存表的名字;lockmode为锁模式,声明这个锁和哪些锁冲突,如果没有声明锁模式,默认为访问专属模式,nowait声明锁表不会等待任何冲突的锁释放,如果不得不等待获取所要求的锁,就会推出事务。

如:lock table emp,,或者,锁表a, b;


postgresql锁