如果SQL语句中有任何错误,系统将自动回滚更改,如何启动事务?
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
答案 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
请参阅以下链接了解更多详情
答案 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