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

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

BEGIN;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

UPDATE parent SET b1=10;

SELECT * FROM active_locks;

ROLLBACK;

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

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

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

parent_pkey | relation |    12401 |    16392 |      |       | 2/22               | 12028 | RowExclusiveLock | t

parent      | relation |    12401 |    16389 |      |       | 2/22               | 12028 | RowExclusiveLock | t

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

 

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

BEGIN;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

UPDATE parent SET b1=10 WHERE pid=2;  //pid=2”指明要使用索引,但“b1=10”表明要读取表数据

SELECT * FROM active_locks;

ROLLBACK;

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

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

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

parent_pkey | relation |    12401 |    16392 |      |       | 2/28               | 12028 | RowExclusiveLock | t

parent      | relation |    12401 |    16389 |      |       | 2/28               | 12028 | RowExclusiveLock | t

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

 

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

BEGIN;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

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

SELECT * FROM active_locks;

ROLLBACK;

    查询active_locks视图,可以得到类似如下的结果,表明在表上增加了一个表级锁“RowShareLock”和“RowExclusiveLock”,在索引parent_pkey上增加了三个锁包括谓词锁“SIReadLock”;另外,在子表child和子表的索引上,增加了一个谓词锁“SIReadLock”和“RowShareLock”锁且在子表的索引页上增加了“AccessShareLock”锁:

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

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

child_pkey  | relation |    12401 |    16397 |      |       | 2/29               | 12028 | AccessShareLock  | t

child       | relation |    12401 |    16394 |      |       | 2/29               | 12028 | RowShareLock     | t

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

parent_pkey | relation |    12401 |    16392 |      |       | 2/29               | 12028 | RowExclusiveLock | t

parent      | relation |    12401 |    16389 |      |       | 2/29               | 12028 | RowShareLock     | t

parent      | relation |    12401 |    16389 |      |       | 2/29               | 12028 | RowExclusiveLock | t

child       | relation |    12401 |    16394 |      |       | 2/29               | 12028 | SIReadLock       | t

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

 

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

BEGIN;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

UPDATE parent SET b1=10;

SELECT * FROM active_locks;

ROLLBACK;

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

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

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

parent_pkey | relation |    12401 |    16392 |      |       | 2/30               | 12028 | RowExclusiveLock | t

parent      | relation |    12401 |    16389 |      |       | 2/30               | 12028 | RowExclusiveLock | t

   

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

BEGIN;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

UPDATE parent SET b1=10 WHERE pid=2;

SELECT * FROM active_locks;

ROLLBACK;

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

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

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

parent_pkey | relation |    12401 |    16392 |      |       | 2/31               | 12028 | RowExclusiveLock | t

parent      | relation |    12401 |    16389 |      |       | 2/31               | 12028 | RowExclusiveLock | t

 

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

BEGIN;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

UPDATE parent SET pid=10 WHERE pid=2;

SELECT * FROM active_locks;

ROLLBACK;

    查询active_locks视图,可以得到类似如下的结果,表明在表上增加了表级锁“RowShareLock”和“RowExclusiveLock”,在索引parent_pkey上增加了“AccessShareLock”和“RowExclusiveLock”锁;在子表child和子表的索引上分别增加了“RowShareLock”和“AccessShareLock”锁:

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

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

child_pkey  | relation |    12401 |    16397 |      |       | 2/32               | 12028 | AccessShareLock  | t

child       | relation |    12401 |    16394 |      |       | 2/32               | 12028 | RowShareLock     | t

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

parent_pkey | relation |    12401 |    16392 |      |       | 2/32               | 12028 | RowExclusiveLock | t

parent      | relation |    12401 |    16389 |      |       | 2/32               | 12028 | RowShareLock     | t

parent      | relation |    12401 |    16389 |      |       | 2/32               | 12028 | RowExclusiveLock | t

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值