【发布时间】:2013-08-12 12:57:10
【问题描述】:
我想做下面的事情。有一个程序包含另外两个程序。 第一个将一些日期插入到我的“用户”表中,第二个对其他一些表执行相同的操作。问题是,当我使用错误的“CountryID”调用此 SP 并导致进程按预期出现错误时,第一个 SP(插入用户名)提交! 显然我想要的是在这个错误之后回滚。
BEGIN
START TRANSACTION ;
SET @Username = _Username;
CALL `InsertUsername` (
@Username , @UserID
);
CALL `InsertAddress` (
@UserID , _CountryID , _AdderssText , _PostalCode
);
COMMIT ;
END
【问题讨论】:
-
InsertUsername看起来像什么?它是否开始/提交自己的事务? -
不,它没有。它实际上看起来像这样: BEGIN INSERT INTO
user(UserID,Username) VALUES (NULL , _Username) ; SELECT userid INTO _UserID FROM user WHERE username = _Username ;结束 -
奇怪,你确定
user和address是InnoDB表吗? -
是的,我已经检查过了,确定它们是 InnoDB。关键是,当我将事务用于没有任何调用的过程时,它可以正常工作,但是在像上面这样的 SP 中却没有,有什么想法吗?或者如果情况尚不清楚,请要求进一步解释。
-
InsertAddress里面有START TRANSACTION吗?如果是这样,那将导致现有事务的隐式提交。
标签: mysql stored-procedures transactions nested