過程大致意思:
驗證: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,它解決了髒讀的問題...