尝试....在mysql中捕获事务?

时间:2015-06-22 06:01:31

标签: mysql sql

如果SQL语句中有任何错误,系统将自动回滚更改,如何启动事务?

Transaction MySQL

PHP + MySQL transactions examples

PHP中的

try {
    // First of all, let's begin a transaction
    $db->beginTransaction();

    // A set of queries; if one fails, an exception should be thrown
    $db->query('first query');
    $db->query('second query');
    $db->query('third query');

    // If we arrive here, it means that no exception was thrown
    // i.e. no query has failed, and we can commit the transaction
    $db->commit();
} catch (Exception $e) {
    // An exception has been thrown
    // We must rollback the transaction
    $db->rollback();
}

如何在没有PHP的情况下重复逻辑,只有MYSQL

2 个答案:

答案 0 :(得分:8)

您可以将多个查询写入MySQL过程/函数,并且可以像下面给出的示例一样维护事务。基本上,您声明一个将调用rollback的错误处理程序。

PROCEDURE `myprocedure`()
BEGIN

.. Declare statements ..

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN
      .. set any flags etc  eg. SET @flag = 0; ..
      ROLLBACK;
END;

START TRANSACTION;

    .. Query 1 ..
    .. Query 2 ..
    .. Query 3 ..

COMMIT;
.. eg. SET @flag = 1; ..

END

请参阅以下链接了解更多详情

MySQL : transaction within a stored procedure

How can I use transactions in my MySQL stored procedure?

答案 1 :(得分:0)

这是我在SQL中与事务相关的最后一项工作,也许下面的代码示例可以帮助您。该代码是为 MS SQL服务器开发的。 请注意,您无法在MySQL服务器中使用它,因为MySQL没有该功能。

主要思想是将主查询(可以多于一个)置于"尝试"和"交易"子句,那么如果查询执行成功,那么查询将在数据库中提交,否则如果失败,将在" catch"中引发错误。事务完全回滚之前的部分。

BEGIN TRY
    BEGIN TRANSACTION
        --Insert Your Queries Here--
    COMMIT
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();


    IF @@TRANCOUNT > 0
    ROLLBACK 

    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );

END CATCH