PostgreSQL V9.6 SELECT操作加锁与隔离级别的示例

SELECT操作触发的锁

    1,隔离级别为可串行化:

BEGIN;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

SELECT * FROM parent;

SELECT * FROM active_locks;

COMMIT;

    查询active_locks视图,可以得到类似如下的结果,表明在表上增加了一个表级锁“AccessShareLock”和谓词锁“SIReadLock”,在索引parent_pkey上增加了一个“AccessShareLock”锁:

   relname   | locktype | database | relation | page | tuple | virtualtransaction |  pid  |      mode       | granted

-------------+----------+----------+----------+------+-------+--------------------+-------+-----------------+---------

 parent_pkey | relation |    12401 |    16392 |      |       | 2/14               | 12028 | AccessShareLock | t

 parent      | relation |    12401 |    16389 |      |       | 2/14               | 12028 | AccessShareLock | t

 parent      | relation |    12401 |    16389 |      |       | 2/14               | 12028 | SIReadLock      | t

 

    2,隔离级别为可串行化,但查询使用索引并读取表数据:

BEGIN;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

SELECT * FROM parent WHERE pid=2;  //pid=2”指明要使用索引,但“*”表明要读取表数据

SELECT * FROM active_locks;

COMMIT;

    查询active_locks视图,可以得到类似如下的结果,表明在表上增加了一个表级锁“AccessShareLock”在元组上增加了谓词锁“SIReadLock”,在索引parent_pkey上增加了一个“AccessShareLock”锁且在索引页上增加了一个谓词锁“SIReadLock”:

  relname   | locktype | database | relation | page | tuple | virtualtransaction |  pid  |      mode       | granted

------------+----------+----------+----------+------+-------+--------------------+-------+-----------------+--------

parent_pkey | relation |    12401 |    16392 |      |       | 2/18               | 12028 | AccessShareLock | t

parent      | relation |    12401 |    16389 |      |       | 2/18               | 12028 | AccessShareLock | t

parent      | tuple    |    12401 |    16389 |    0 |     4 | 2/18               | 12028 | SIReadLock      | t

parent_pkey | page     |    12401 |    16392 |    1 |       | 2/18               | 12028 | SIReadLock      | t

 

    3,隔离级别为可串行化,但查询只在索引上进行:

BEGIN;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

SELECT pid FROM parent WHERE pid=2; //pid=2”指明要使用索引,但“pid”表明不会读取表数据,只需要读取索引即可

SELECT * FROM active_locks;

COMMIT;

    查询active_locks视图,可以得到类似如下的结果,表明在表上增加了一个表级锁“AccessShareLock”在元组上增加了谓词锁“SIReadLock”,在索引parent_pkey上增加了一个“AccessShareLock”锁且在索引页上增加了一个谓词锁“SIReadLock”:

  relname   | locktype | database | relation | page | tuple | virtualtransaction |  pid  |      mode       | granted

------------+----------+----------+----------+------+-------+--------------------+-------+-----------------+--------

parent_pkey | relation |    12401 |    16392 |      |       | 2/17               | 12028 | AccessShareLock | t

parent      | relation |    12401 |    16389 |      |       | 2/17               | 12028 | AccessShareLock | t

parent_pkey | page     |    12401 |    16392 |    1 |       | 2/17               | 12028 | SIReadLock      | t

parent      | tuple    |    12401 |    16389 |    0 |     4 | 2/17               | 12028 | SIReadLock      | t

 

    4,隔离级别为读已提交:

BEGIN;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SELECT * FROM parent;

SELECT * FROM active_locks;

COMMIT;

    查询active_locks视图,可以得到类似如下的结果,表明在表上和索引上分别增加了一个“RowExclusiveLock”锁:

   relname   | locktype | database | relation | page | tuple | virtualtransaction |  pid  |      mode       | granted

-------------+----------+----------+----------+------+-------+--------------------+-------+-----------------+---------

 parent_pkey | relation |    12401 |    16392 |      |       | 2/15               | 12028 | AccessShareLock | t

 parent      | relation |    12401 |    16389 |      |       | 2/15               | 12028 | AccessShareLock | t

   

    5,隔离级别为可串行化,但查询使用索引并读取表数据:

BEGIN;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SELECT * FROM parent WHERE pid=2;  //pid=2”指明要使用索引,但“*”表明要读取表数据

SELECT * FROM active_locks;

COMMIT;

    查询active_locks视图,可以得到类似如下的结果,表明在表上增加了一个表级锁“AccessShareLock”,在索引parent_pkey上增加了一个“AccessShareLock”锁:

   relname   | locktype | database | relation | page | tuple | virtualtransaction |  pid  |      mode       | granted

-------------+----------+----------+----------+------+-------+--------------------+-------+-----------------+--------

 parent_pkey | relation |    12401 |    16392 |      |       | 2/20               | 12028 | AccessShareLock | t

 parent      | relation |    12401 |    16389 |      |       | 2/20               | 12028 | AccessShareLock | t

 

    6,隔离级别为可串行化,但查询只在索引上进行:

BEGIN;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SELECT pid FROM parent WHERE pid=2; //pid=2”指明要使用索引,但“pid”表明不会读取表数据,只需要读取索引即可

SELECT * FROM active_locks;

COMMIT;

    查询active_locks视图,可以得到类似如下的结果,表明在表上增加了一个表级锁“AccessShareLock”,在索引parent_pkey上增加了一个“AccessShareLock”锁:

  relname   | locktype | database | relation | page | tuple | virtualtransaction |  pid  |      mode       | granted

------------+----------+----------+----------+------+-------+--------------------+-------+-----------------+--------

parent_pkey | relation |    12401 |    16392 |      |       | 2/21               | 12028 | AccessShareLock | t

parent      | relation |    12401 |    16389 |      |       | 2/21               | 12028 | AccessShareLock | t

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值