最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于postgresql行級鎖for update測試

 更新時(shí)間:2020年12月30日 15:54:12   作者:朔語  
這篇文章主要介紹了基于postgresql行級鎖for update測試,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

創(chuàng)建表:

CREATE TABLE db_user
(
 id character varying(50) NOT NULL,
 age integer,
 name character varying(100),
 roleid character varying,
 CONSTRAINT db_user_pkey PRIMARY KEY (id)
)

隨便插入幾條數(shù)據(jù)即可。

一、不加鎖演示

1、打開一個(gè)postgreSQL的SQL Shell或pgAdmin的SQL編輯器窗口,執(zhí)行:

begin;
select * from db_user where name='lisi';

輸出結(jié)果:

2、再打開一個(gè)postgreSQL的SQL Shell或pgAdmin的SQL編輯器窗口,執(zhí)行:

begin;
select * from db_user where name='lisi';

輸出結(jié)果:

二、加鎖演示(for update)

1、打開一個(gè)postgreSQL的SQL Shell或pgAdmin的SQL編輯器窗口,執(zhí)行:

begin;
select * from db_user where name='lisi' for update;

輸出結(jié)果:

2、再打開一個(gè)postgreSQL的SQL Shell或pgAdmin的SQL編輯器窗口,執(zhí)行:

begin;
select * from db_user where name='lisi' for update;

輸出結(jié)果:

查詢一直處于執(zhí)行中狀態(tài)。

3、第一個(gè)窗口執(zhí)行:

commit;

第二個(gè)窗口立即執(zhí)行查詢操作,結(jié)果如下:

第二個(gè)窗口記得提交commit;。

三、加鎖演示(for update nowait)

1、打開一個(gè)postgreSQL的SQL Shell或pgAdmin的SQL編輯器窗口,執(zhí)行:

begin;
select * from db_user where name='lisi' for update nowait;

輸出結(jié)果:

2、再打開一個(gè)postgreSQL的SQL Shell或pgAdmin的SQL編輯器窗口,執(zhí)行:

begin;
select * from db_user where name='lisi' for update nowait;

輸出結(jié)果:

不會進(jìn)行資源等待,返回錯(cuò)誤信息。

3、第一個(gè)窗口執(zhí)行:

commit;

提交成功,資源鎖釋放。

總結(jié):

for update nowait和 for update 都會對所查詢到得結(jié)果集進(jìn)行加鎖,所不同的是,如果另外一個(gè)線程正在修改結(jié)果集中的數(shù)據(jù),for update nowait 不會進(jìn)行資源等待,只要發(fā)現(xiàn)結(jié)果集中有些數(shù)據(jù)被加鎖,立刻返回 “55P03錯(cuò)誤,內(nèi)容是無法在記錄上獲得鎖.

命令說明:

begin;--開啟事務(wù)

begin transaction;--開啟事務(wù)

commit;--提交

rollback;--回滾

set lock_timeout=5000;--設(shè)置超時(shí)時(shí)間

注意:

連表查詢加鎖時(shí),不支持單邊連接形式,例如:

select u.*,r.* from db_user u left join db_role r on u.roleid=r.id for update;

支持以下形式,并鎖住了兩個(gè)表中關(guān)聯(lián)的數(shù)據(jù):

select u.*,r.* from db_user u, db_role r where u.roleid=r.id for update;

補(bǔ)充:PostgreSQL select for update指定列(兼容oracle)

我們可以使用select for update語句來指定鎖住某一張表,在oracle中我們可以在for update語句后指定某一列,用來單獨(dú)鎖定指定列的數(shù)據(jù)。

oracle例子:

建表:

SQL> create table t1(id int, c2 varchar(20), c3 int, c4 float, c5 float); 
Table created.
SQL> create table t2(id int, c6 int); 
Table created.
SQL> insert into t1 values (1, 'SA_REP', 1, 100, 1); 
1 row created.
SQL> insert into t1 values (1, 'SA_REP123', 1, 100, 1); 
1 row created.
SQL> insert into t2 values (1, 2500);
1 row created.

查詢:

我們使用下列查詢用來只鎖住c4列。

SQL> SELECT e.c3, e.c4, e.c5 
 2  FROM t1 e JOIN t2 d 
 USING (id) 
 WHERE c2 = 'SA_REP' 
 AND c6 = 2500 
 3 4 5 6  FOR UPDATE OF e.c4 
 7  ORDER BY e.c3; 
  C3   C4   C5
---------- ---------- ----------
   1  100   1

PostgreSQL兼容方法:

建表:

create table t1(id int, c2 text, c3 int, c4 float, c5 float); 
create table t2(id int, c6 int); 
insert into t1 values (1, 'SA_REP', 1, 100, 1); 
insert into t1 values (1, 'SA_REP123', 1, 100, 1); 
insert into t2 values (1, 2500);

pg中使用方法和oracle類似,只是需要將order by語法放到前面,并且將列名換成表名。

bill=# SELECT e.c3, e.c4, e.c5 
bill-# FROM t1 e JOIN t2 d 
bill-# USING (id) 
bill-# WHERE c2 = 'SA_REP' 
bill-# AND c6 = 2500 
bill-# ORDER BY e.c3
bill-# FOR UPDATE OF e ;
 c3 | c4 | c5 
----+-----+----
 1 | 100 | 1
(1 row)

驗(yàn)證:

我們可以驗(yàn)證下pg中是否只鎖定了指定的行。

1、安裝pgrowlocks插件

bill=# create extension pgrowlocks;
CREATE EXTENSION

2、觀察

t1表被鎖:

bill=# select * from pgrowlocks('t1'); 
 locked_row | locker | multi | xids |  modes  | pids 
------------+--------+-------+--------+----------------+--------
 (0,1)  | 1037 | f  | {1037} | {"For Update"} | {2022}
(1 row)

t2表沒有被鎖:

bill=# select * from pgrowlocks('t2'); 
 locked_row | locker | multi | xids | modes | pids 
------------+--------+-------+------+-------+------
(0 rows)

我們還可以再看看t1表中具體被鎖住的數(shù)據(jù):

bill=# SELECT * FROM t1 AS a, pgrowlocks('t1') AS p 
bill-# WHERE p.locked_row = a.ctid; 
 id | c2 | c3 | c4 | c5 | locked_row | locker | multi | xids |  modes  | pids 
----+--------+----+-----+----+------------+--------+-------+--------+----------------+--------
 1 | SA_REP | 1 | 100 | 1 | (0,1)  | 1037 | f  | {1037} | {"For Update"} | {2022}
(1 row)

除此之外,pg中for update子句還有其它的選項(xiàng):

UPDATE – 當(dāng)前事務(wù)可以改所有字段

NO KEY UPDATE – 當(dāng)前事務(wù)可以改除referenced KEY以外的字段

SHARE – 其他事務(wù)不能改所有字段

KEY SHARE – 其他事務(wù)不能改referenced KEY字段

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • postgreSQL 使用timestamp轉(zhuǎn)成date格式

    postgreSQL 使用timestamp轉(zhuǎn)成date格式

    這篇文章主要介紹了postgreSQL 使用timestamp轉(zhuǎn)成date格式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • postgresql 獲取兩個(gè)時(shí)間類型小時(shí)差值案例

    postgresql 獲取兩個(gè)時(shí)間類型小時(shí)差值案例

    這篇文章主要介紹了postgresql 獲取兩個(gè)時(shí)間類型小時(shí)差值案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL配置遠(yuǎn)程連接簡單圖文教程

    PostgreSQL配置遠(yuǎn)程連接簡單圖文教程

    這篇文章主要給大家介紹了關(guān)于PostgreSQL配置遠(yuǎn)程連接的相關(guān)資料,PostgreSQL是一個(gè)功能非常強(qiáng)大的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • PostgreSql 重建索引的操作

    PostgreSql 重建索引的操作

    這篇文章主要介紹了PostgreSql 重建索引的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • postgresql 兩表關(guān)聯(lián)更新操作

    postgresql 兩表關(guān)聯(lián)更新操作

    這篇文章主要介紹了postgresql 兩表關(guān)聯(lián)更新操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Abp.NHibernate連接PostgreSQl數(shù)據(jù)庫的方法

    Abp.NHibernate連接PostgreSQl數(shù)據(jù)庫的方法

    這篇文章主要為大家詳細(xì)介紹了Abp.NHibernate連接PostgreSQl數(shù)據(jù)庫的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 基于pgrouting的路徑規(guī)劃處理方法

    基于pgrouting的路徑規(guī)劃處理方法

    這篇文章主要介紹了基于pgrouting的路徑規(guī)劃處理,根據(jù)pgrouting已經(jīng)集成的Dijkstra算法來,結(jié)合postgresql數(shù)據(jù)庫來處理最短路徑,需要的朋友可以參考下
    2022-04-04
  • PostgreSQL將數(shù)據(jù)加載到buffer cache中操作方法

    PostgreSQL將數(shù)據(jù)加載到buffer cache中操作方法

    這篇文章主要介紹了PostgreSQL將數(shù)據(jù)加載到buffer cache中,我們可以使用pg_prewarm插件來將指定的表加載到OS Buffer或者pg shared buffer中,具體操作方法跟隨小編一起看看吧
    2021-04-04
  • PostgreSQL數(shù)據(jù)庫中如何保證LIKE語句的效率(推薦)

    PostgreSQL數(shù)據(jù)庫中如何保證LIKE語句的效率(推薦)

    這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫中如何保證LIKE語句的效率,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • pgsql批量修改sequences的start方式

    pgsql批量修改sequences的start方式

    這篇文章主要介紹了pgsql批量修改sequences的start方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

罗田县| 石台县| 池州市| 长海县| 资中县| 江阴市| 色达县| 阜新市| 雷州市| 礼泉县| 兴城市| 天长市| 丘北县| 长治市| 方正县| 平湖市| 宜春市| 金堂县| 镇远县| 黔东| 青冈县| 东乡县| 仙居县| 夏邑县| 青州市| 修武县| 枣庄市| 淮滨县| 江山市| 泰州市| 锦州市| 泽库县| 晋宁县| 济阳县| 五常市| 灵台县| 巴中市| 敖汉旗| 德江县| 安义县| 东丽区|