1. 程式人生 > 資料庫 >在postgresql中結束掉正在執行的SQL語句操作

在postgresql中結束掉正在執行的SQL語句操作

結束程序兩種方式:

SELECT pg_cancel_backend(PID)

取消後臺操作,回滾未提交事物 (select);

SELECT pg_terminate_backend(PID)

中斷session,回滾未提交事物(select、update、delete、drop);

SELECT * FROM pg_stat_activity;

根據datid=10841

SELECT pg_terminate_backend (10841);

補充:PostgreSQL無法在PL / pgSQL中開始/結束事務

我正在尋求澄清如何確保plpgsql函式中的原子事務,以及為資料庫進行此特定更改設定了隔離級別.

在下面顯示的plpgsql函式中,我想確保BOTH的刪除和插入成功.當我嘗試將它們包裝在一個事務中時,我收到一個錯誤:

錯誤:無法在PL / pgSQL中開始/結束事務.

如果另一個使用者在此功能已刪除自定義記錄之後,但在此函式有機會插入自定義記錄之前,為情況(RAIN,NIGHT,45MPH)添加了預設行為,下面的函式執行過程中會發生什麼?是否有一個隱式事務包裝插入和刪除,以便如果另一個使用者已經更改了此函式引用的任何一個行,兩者都將回滾?我可以設定此功能的隔離級別嗎?

create function foo(v_weather varchar(10),v_timeofday varchar(10),v_speed varchar(10),v_behavior varchar(10))
   returns setof CUSTOMBEHAVIOR
   as $body$
   begin
    -- run-time error if either of these lines is un-commented
    -- start transaction ISOLATION LEVEL READ COMMITTED;
    -- or,alternatively,set transaction ISOLATION LEVEL READ COMMITTED;
     delete from CUSTOMBEHAVIOR 
     where weather = 'RAIN' and timeofday = 'NIGHT' and speed= '45MPH' ;
    -- if there is no default behavior insert a custom behavior
    if not exists
     (select id from DEFAULTBEHAVIOR where a = 'RAIN' and b = 'NIGHT' and c= '45MPH') then  
      insert into CUSTOMBEHAVIOR
       (weather,timeofday,speed,behavior)
      values
       (v_weather,v_timeofday,v_speed,v_behavior);
    end if;
    return QUERY
    select * from CUSTOMBEHAVIOR where ...  ;
   -- commit;
   end
   $body$
   LANGUAGE plpgsql

一個plpgsql函式在事務中自動執行.這一切都成功了,一切都失敗了.

我引用the manual on plpgsql functions:

Functions and trigger procedures are always executed within a transaction established by an outer query — they cannot start or commit that transaction,since there would be no context for them to execute in. However,a block containing an EXCEPTION clause effectively forms a subtransaction that can be rolled back without affecting the outer transaction.

所以,如果你需要,你可以捕獲理論上可能發生的異常(但是不大可能).

Details on trapping errors in the manual.

您的功能審查和簡化:

CREATE FUNCTION foo(v_weather text,v_timeofday text,v_speed text,v_behavior text)
 RETURNS SETOF custombehavior AS
$body$
BEGIN
DELETE FROM custombehavior
WHERE weather = 'RAIN'
AND  timeofday = 'NIGHT'
AND  speed = '45MPH';
INSERT INTO custombehavior (weather,behavior)
SELECT v_weather,v_behavior
WHERE NOT EXISTS (
  SELECT 1 FROM defaultbehavior
  WHERE a = 'RAIN'
  AND  b = 'NIGHT'
  AND  c = '45MPH'
  );
RETURN QUERY
SELECT * FROM custombehavior WHERE ... ;
END
$body$LANGUAGE plpgsql

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。