gpt4 book ai didi

MySQL - 如何使函数成为原子函数?

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:00 30 4
gpt4 key购买 nike

我的数据库里有这个函数

CREATE FUNCTION BookBed (pPaciente varchar(255),
pHospital bigint(20)) RETURNS BOOLEAN
BEGIN
DECLARE NumLeitosDisponiveis INT;
DECLARE vReservaOK BOOLEAN;
DECLARE dt TIMESTAMP;

SET dt = (Select now());
SET NumLeitosDisponiveis = (SELECT AVAILABLEBEDCOUNT FROM HOSPITAL WHERE ID = pHospital);


IF((SELECT NumLeitosDisponiveis) > 0) THEN
BEGIN
START TRANSACTION;

INSERT INTO RESERVATION(PERSON, HOSPITAL, DATE) VALUES (pPaciente, pHospital, dt);

UPDATE HOSPITAL
SET AVAILABLEBEDCOUNT = AVAILABLEBEDCOUNT - 1
WHERE ID = pHospital;

SET vReservaOk = true;

commit;
END;
ELSE
SET vReservaOk = false;
END IF;


RETURN vReservaOK;

END;

在我的 if-else 语句的 if 部分,我想以原子方式执行所有操作。我想使用 START TRANSACTION 命令,但它们在函数中是不允许的,我找不到任何其他命令来执行它。

函数默认是原子的吗?如果没有,有什么办法可以实现吗?

谢谢,奥斯卡

编辑:如果我必须使用一个函数,是否可以进行交易?

最佳答案

使用带有输出参数的存储过程来返回操作状态。

DELIMITER //

CREATE PROCEDURE BookBed (
pPaciente varchar(255),
pHospital bigint(20),
OUT oReservaOK boolean)
BEGIN
DECLARE NumLeitosDisponiveis INT;
DECLARE dt TIMESTAMP;

SET dt = (Select now());
SET NumLeitosDisponiveis =
SELECT AVAILABLEBEDCOUNT FROM HOSPITAL WHERE ID = pHospital;

IF((SELECT NumLeitosDisponiveis) > 0) THEN
BEGIN
START TRANSACTION;

INSERT INTO RESERVATION(PERSON, HOSPITAL, DATE)
VALUES (pPaciente, pHospital, dt);

UPDATE HOSPITAL
SET AVAILABLEBEDCOUNT = AVAILABLEBEDCOUNT - 1
WHERE ID = pHospital;

SET oReservaOk = true;

commit;
END;
ELSE
SET oReservaOk = false;
END IF;
END//

如果您在使用 Hibernate 调用存储过程时遇到问题,请将事务逻辑移至 Hibernate。也就是说,使用 Hibernate 构造启动、提交或回滚事务。

编辑事务需要使用 InnoDB 引擎,正如@bobobobo 在评论中指出的那样。

关于MySQL - 如何使函数成为原子函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6496237/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com