2015-06-22 55 views
5

如何在SQL语句中有任何错误时启动事务,系统将自动回滚这些更改?尝试....在mysql中捕获事务?

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

这是我最后的工作在SQL与交易相关的,也许下面的代码示例可以帮助你。该代码是为MS SQL服务器开发的,您可能需要为MySQL服务器进行一些更改。

主要思想是在“try”和“transaction”子句中放置主查询(可以是多个),然后如果查询成功执行,则查询将在数据库中提交,否则在如果失败,则在事务完全回滚之前,“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 
0

你可以写多个查询到MySQL过程/函数,可以保持交易就像下面给出的样品。基本上,你声明一个将调用回滚的错误处理程序。

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?