2015-06-22 2 views
5

Как я могу начать транзакцию, если в операторах SQL есть какая-либо ошибка, система автоматически откатится от изменений?try .... catch в 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», а затем, если запрос выполняется успешно, следовательно, запрос будет передан в базе данных, иначе в случай сбоя, ошибка будет поднята в разделе «улов», прежде чем транзакция будет полностью отклонена.

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?