【问题标题】:using mysql transaction in stored procedure在存储过程中使用 mysql 事务
【发布时间】: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 ;结束
  • 奇怪,你确定useraddress是InnoDB表吗?
  • 是的,我已经检查过了,确定它们是 InnoDB。关键是,当我将事务用于没有任何调用的过程时,它可以正常工作,但是在像上面这样的 SP 中却没有,有什么想法吗?或者如果情况尚不清楚,请要求进一步解释。
  • InsertAddress 里面有 START TRANSACTION 吗?如果是这样,那将导致现有事务的隐式提交。

标签: mysql stored-procedures transactions nested


【解决方案1】:

我最近发现,在我们在存储过程中定义退出处理程序之前,事务并没有按预期工作。

我们创建了一个相当粗糙的单线作为默认使用:

declare exit handler for SQLWARNING, SQLEXCEPTION begin show warnings limit 5; rollback; end;

【讨论】:

  • 我试过了,它总是给我一个错误并且不执行程序的步骤。我正在使用mysql。任何帮助请!!
  • 谢谢!!你真的给我指出了正确的方向!!它对我有用! :)
【解决方案2】:

就像 simon.evans 说的,我终于找到了正确的答案,它对我有用,所以我想添加更多细节:

CREATE PROCEDURE `add`(IN serial_number VARCHAR(20), IN tarnsaction_type INT
, OUT errcode VARCHAR(3))
BEGIN

DECLARE      my_balance NUMERIC(15,3);
DECLARE EXIT HANDLER FOR SQLEXCEPTION 
  BEGIN

  ROLLBACK;
  SET errcode = '058';
  END;

 CALL procedure2(p_account_id,v_account_balance);
 #do what ever you want to do here

END$$

如果你有问题可以问我 因为我有同样的问题,最后我找到了这个答案:)

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多