takiej mozliwości na oraclu. Czy dobrym rozwiązaniem jest zabijanie sesji
posiadających transakcje działające dłużej niż n czasu? Poniżej przedstawiam
procedurę, którą odpalam w job-ie:
CREATE OR REPLACE PROCEDURE SYS.kill_old_transactions
IS
CURSOR cur
IS
SELECT s.SID, s.serial# serial, t.start_date
FROM v$transaction t, v$session s
WHERE s.saddr = t.ses_addr;
d DATE;
res NUMBER;
QUERY VARCHAR2 (100);
BEGIN
FOR c IN cur
LOOP
SELECT SYSDATE
INTO d
FROM DUAL;
res :=
TO_NUMBER (TO_CHAR (d, 'SSSSS'))
- TO_NUMBER (TO_CHAR (c.start_date, 'SSSSS'));
IF (res 30)
THEN
QUERY :=
'alter system kill session ''' || c.SID || ', ' || c.serial
|| '''';
EXECUTE IMMEDIATE (QUERY);
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
RAISE;
END kill_old_transactions;
/