我有一个存储过程,只要新用户在我的系统上注册,它就会触发 - 在转发注册消息时会提示他们在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;
任何建议都将不胜感激 - 亚历克斯。