Oracle 自制事务是指的存储过程和函数可以自己处理内部事务不受外部事务的影响,使用方法很简单如下:
FUNCTION F_GET_KEY_GEN(P_KYE_NAME IN VARCHAR2)
RETURN VARCHAR2 as
pragma autonomous_transaction; --设置为自制事务--
V_RECORD NUMBER;
BEGIN
commit;
END;
使用场景还要从项目中的一个BUG说起,项目中的工作流需要产生一个流水号,为了保存流水号的唯一再查找最新流水号的sql后增加了"FOR UPDATE WAIT 5"这样可以确保sql所查出来的值是所有事务提交后的值,如还有事务未提交等待5秒后出错。
SELECT T.KEY_VALUE, T.THIS_DATE
INTO V_KEY_ROW.KEY_VALUE, V_KEY_ROW.THIS_DATE
FROM T_KEYTABLE T
WHERE T.KEY_NAME = P_KYE_NAME
AND ROWNUM = 1
FOR UPDATE WAIT 5;
上面方法可以确保流水号最新但是带来了一个问题,如果创建流水号的操作位于一个业务操作很复杂耗时很长的事务当中,当这个事务并发时就会出现流水号创建错误!这个BUG解决方法我就是使用的自制事务,让创建流水号自己提交事务且对别的事务没有影响。
附件中有流水号产生的函数