Postgresql 函式 事務隔離級別 實踐

2021-08-28 07:43:40 字數 3042 閱讀 8372

過程大致意思:

驗證:func 函式中依次呼叫 funca,funcb函式,三個函式中均有update操作,看看三個函式的select 是否可檢視未提交的update

表:create table public.audit

(id text collate pg_catalog."default",

name text collate pg_catalog."default"

)任意插入三行資料

定義三個函式如下:

-- function: public.func()

-- drop function public.func();

create or replace function public.func(

)returns void

language 'plpgsql'

cost 100

volatile 

as $body$

declare newid text = '10';

declare newname text='jack';

declare oldid text;

declare oldname text;

declare rowcursor refcursor;

begin 

update audit set id = newid,name = newname where 1=1;

execute funca();

execute funcb();

--子事務update 在主事務中是否可以看到

open rowcursor for select * from audit;    

loop

fetch rowcursor into oldid,oldname;

if found then

raise notice 'func:id,name: %,%',oldid,oldname;

else 

exit;

end if;

end loop;

close rowcursor;

end;

$body$;

-- function: public.funca()

-- drop function public.funca();

create or replace function public.funca(

)returns void

language 'plpgsql'

cost 100

volatile 

as $body$

declare oldid text;

declare oldname text;

declare rowcursor refcursor;

begin 

--看看主事務的update 在子事務中是否勀檢視

open rowcursor for select * from audit;    

loop

fetch rowcursor into oldid,oldname;

if found then    

raise notice 'funca:id,name,state: %,%',oldid,oldname;

else 

exit;

end if;

end loop;

close rowcursor;

--子事務更新,看看另乙個子事務和主事務是否能看到

update audit set id = '11' where id is not null;

end;

$body$;

-- function: public.funcb()

-- drop function public.funcb();

create or replace function public.funcb(

)returns void

language 'plpgsql'

cost 100

volatile 

as $body$

declare oldid text;

declare oldname text;

declare rowcursor refcursor;

begin 

--子事務a的update 在子事務b中是否檢視

open rowcursor for select * from audit;    

loop

fetch rowcursor into oldid,oldname;

if found then

raise notice 'funcb:id,name,state: %,%',oldid,oldname;

else 

exit;

end if;

end loop;

close rowcursor;

end;

$body$;

alter function public.funcb()

owner to postgres;

執行結果,與你初始化的資料有關(事先插入了三行資料)

notice:  funca:id,name,state: 10,jack

notice:  funca:id,name,state: 10,jack

notice:  funca:id,name,state: 10,jack

notice:  funcb:id,name,state: 11,jack

notice:  funcb:id,name,state: 11,jack

notice:  funcb:id,name,state: 11,jack

notice:  func:id,name: 11,jack

notice:  func:id,name: 11,jack

notice:  func:id,name: 11,jack

結論:在read commited 與repeatable read 隔離級別下,均可相互看到未提交的update。異常回滾另驗證

PostGreSQL 事務操作

一 隔離問題及隔離級別 1 隔離問題 a 髒讀 乙個事務讀到另乙個事務沒有提交的資料 b 不可重複讀 乙個事務讀到另乙個事務已提交的資料 update delete 乙個事務重新執行查詢,發現資料因被另乙個已經提交的事務 update 操作而改變 c 虛讀 幻讀 乙個事務讀到另乙個事務已提交的資料 ...

PostgreSQL的事務隔離分析

不懂的同學先補補概念 reference wiki 隔離級別 isolation levels 有四種隔離級別 昨天被問了乙個問題 當存在表test id int 並有id 1一條記錄,那麼以下兩種操作會有什麼行為 sessiona啟動事務後,sessionb做了更新id 2操作後,此時sessio...

Mysql 事務隔離級別 InnoDB實現隔離機制

在read uncommitted級別中,事務所做的寫操作,即使沒有提交,對其他事務也是可見的,a事務可以讀取b事務未提交的資料,這就叫做未提交讀 髒讀。這個級別會導致很多問題,但從效能上來說,並不比其他級別好太多。大部分資料庫系統的預設隔離級別就是 read committed,它解決了髒讀的問題...