Oracle DBMS - 管理事务之间的并发

时间:2014-04-11 15:34:14

标签: sql oracle stored-procedures procedure

我有一个存储过程,只要新用户在我的系统上注册,它就会触发 - 在转发注册消息时会提示他们在AFTER触发器上更改密码。

CREATE OR REPLACE TRIGGER trg_users_after
AFTER INSERT OR UPDATE ON users FOR EACH ROW
BEGIN
-- Alert a user that they need to change their password
IF :NEW.pass_changed = 0 THEN
    send_message(:NEW.user_id, null, 'ALERT','Thank-you for registering, please change your password for security reasons!', null);
    updateChanged(:NEW.user_id);
END IF;
END;

目前我遇到的问题是两个方法都试图获取锁定以提交其进程,这会导致死锁 - 我理解为什么会发生这种情况,但我如何在Oracle中管理并发以确保{{ 1}}在send_message()被解雇之前完成其交易?

发送消息:

updateChanged()

更新已更改:

CREATE OR REPLACE PROCEDURE send_message( 
   to_user      users.user_id%TYPE, 
   from_user    users.user_id%TYPE,
   msg_type     STRING,
   this_message STRING,
   request_id   requests.requests_id%TYPE
)
AS
   pragma autonomous_transaction;
BEGIN
   INSERT INTO messages 
   VALUES('', to_user, from_user, msg_type, this_message, '', '', request_id);
   COMMIT;
END send_message;

任何建议都将不胜感激 - 亚历克斯。

0 个答案:

没有答案