」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼我的MySQL預存程序無法成功執行事務?

為什麼我的MySQL預存程序無法成功執行事務?

發佈於2024-11-18
瀏覽:879

Why Do My MySQL Stored Procedures Fail to Execute Transactions Successfully?

解決MySQL 儲存過程中的事務問題

當嘗試在MySQL 儲存過程中實現事務時,開發人員可能會遇到意外錯誤。本文將探討可能阻止事務性預存程序成功執行的語法和邏輯錯誤。

案例:一個不成功的事務

開發人員在以下情況下遇到問題:嘗試在儲存過程中實現事務。儘管遵循了 MySQL 文檔,但該過程未能成功執行並提示無法儲存變更。經過進一步檢查,程式碼在語法上似乎是正確的。

分析程式碼

提供的程式碼片段如下:

BEGIN

DECLARE poid INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION SQLWARNING
BEGIN
    ROLLBACK;
END

START TRANSACTION;

    -- ADD option 5
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0);
    SET poid = (SELECT LAST_INSERT_ID());
    INSERT INTO product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,price_prefix,points,points_prefix,weight,weight_prefix) VALUES(poid,insertedProductID,5,50,0,0,4.99,' ',0,' ',0,' ');

    -- ADD option 12
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1);

    -- ADD option 13
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,13,0);

COMMIT;

END

識別錯誤

經過仔細檢查,發現兩個語法錯誤:

  1. 缺少逗號退出處理程序:

    • 在EXIT HANDLER 聲明中,應該用逗號分隔條件。
  2. 缺分號:

    • EXIT HANDLER 的 END 語句缺少終止分號。

更正的代碼

更正後的代碼如下:

BEGIN

DECLARE poid INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;

START TRANSACTION;

    -- ADD option 5
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0);
    SET poid = (SELECT LAST_INSERT_ID());
    INSERT INTO product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,price_prefix,points,points_prefix,weight,weight_prefix) VALUES(poid,insertedProductID,5,50,0,0,4.99,' ',0,' ',0,' ');

    -- ADD option 12
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1);

    -- ADD option 13
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,13,0);

COMMIT;

END;
最新教學 更多>
  • 如何防止會話劫持:破解共享會話ID之謎?
    如何防止會話劫持:破解共享會話ID之謎?
    防止會話劫持:解決多個客戶端共享單一會話ID 的難題所提出的問題對於維護網路安全至關重要應用程式.該問題圍繞著防止多個客戶端使用相同的會話 ID,從而減少會話劫持嘗試。然而,了解 HTTP 協定的局限性至關重要。 HTTP 的無狀態特性帶來了固有的挑戰。一旦將會話 ID 發佈給用戶,伺服器實際上就不...
    程式設計 發佈於2024-11-18
  • Python 3 的函數註解如何處理集合類型提示?
    Python 3 的函數註解如何處理集合類型提示?
    集合類型提示的函數註釋在Python 3 中,函數註釋是指定類型的常用方法,特別是對於同類集合(例如,列出)。然而,使用者尋求一種將集合類型合併到這些註釋中的方法。 基於文件字串的類型提示最初,Python 開發人員依賴格式化文件字串,例如 reStructuredText 或Sphinx,提供集合...
    程式設計 發佈於2024-11-18
  • 為什麼我的 Chrome 輸入邊框在縮放時消失?
    為什麼我的 Chrome 輸入邊框在縮放時消失?
    Chrome 邊框在縮放時消失問題排查此論壇帖子中提出的問題涉及當用戶放大或縮小時Chrome 中的輸入邊框消失出去。雖然該問題可能並非對所有使用者都普遍存在,但它會影響特定的表單(可在 http://jsfiddle.net/TKb6M/91/ 上找到)。 例如,當縮放到 90% 時,原始表單邊框...
    程式設計 發佈於2024-11-18
  • 如何使用 Properties Maven 插件讀取 Maven 中的外部屬性檔案?
    如何使用 Properties Maven 插件讀取 Maven 中的外部屬性檔案?
    在Maven中讀取外部屬性文件雖然可以使用資源過濾來讀取Maven中的屬性文件,但它可能無法滿足以下要求在pom.xml 中定義特定的屬性檔。要解決這個問題,請考慮利用 Properties Maven 外掛程式。 Properties Maven 外掛程式可讓您讀取 Maven 中的外部屬性檔案。...
    程式設計 發佈於2024-11-18
  • 如何使用Python重命名目錄中的多個檔案?
    如何使用Python重命名目錄中的多個檔案?
    使用Python 重新命名目錄中的多個文件要使用Python 重命名目錄中的多個文件,請考慮使用os .rename(src , dst) 功能,方便重命名或移動檔案和目錄。這是一個範例程式碼片段:import os # Iterate through the files in the direct...
    程式設計 發佈於2024-11-18
  • 如何在 PHP 中將數組值重新索引為數字索引?
    如何在 PHP 中將數組值重新索引為數字索引?
    在PHP 中重新索引數組值考慮以下帶有關聯鍵的數組:$array = [ 'id' => 3, 'user_id' => 1, 'clan_id' => 1, // ... 'skill25xp' => 13373505 ];要將鍵重新...
    程式設計 發佈於2024-11-18
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-18
  • 如何在 WooCommerce 4+ 中將自訂庫存狀態新增至 WooCommerce 產品?
    如何在 WooCommerce 4+ 中將自訂庫存狀態新增至 WooCommerce 產品?
    WooCommerce 4 中WooCommerce 產品的自訂庫存狀態向WooCommerce 4 中的產品添加自訂庫存狀態是一個相對簡單的過程。但需要修改具體功能,才能確保前後端正確顯示狀態。 新增自訂庫存狀態新增自訂庫存狀態,新增將下列程式碼新增至您的functions.php檔案:funct...
    程式設計 發佈於2024-11-18
  • 如何在 Chrome DevTools 中存取 chrome.storage.sync 資料?
    如何在 Chrome DevTools 中存取 chrome.storage.sync 資料?
    在Chrome DevTools 中訪問chrome.storage.sync儘管Chrome DevTools 中提供了本地儲存和會話儲存檢查器,但使用者經常遇到chrome.storage.sync 缺少類似功能的情況。這可以透過替代方法解決。 使用擴充功能進行Chrome 儲存檢查儲存區域檢視...
    程式設計 發佈於2024-11-18
  • Scala Actor 可以取代 Go 的 Goroutine 進行函式庫移植嗎?
    Scala Actor 可以取代 Go 的 Goroutine 進行函式庫移植嗎?
    協程與Actor:Go 和Scala 的比較分析Actor 模型和Goroutines 之間的相似之處讓一些人質疑Scala是否可能是適合移植利用Goroutines 的Go 函式庫的語言。然而,仔細檢查就會發現這兩個概念之間有顯著差異。 協程:通訊順序流程 (CSP) 的基礎Go 中實現的 Gor...
    程式設計 發佈於2024-11-18
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-18
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-18
  • Python 的字串連接優化適用於大字串嗎?
    Python 的字串連接優化適用於大字串嗎?
    如何在Python 中高效地將一個字串附加到另一個字串在Python 中,使用' ' 運算子連接字串是一項常見任務。雖然下面的程式碼很簡單:var1 = "foo" var2 = "bar" var3 = var1 var2它提出了關於效率...
    程式設計 發佈於2024-11-18
  • 如何使用 PHP 的 `strtotime()` 和替代方案處理 1970 年之前的日期?
    如何使用 PHP 的 `strtotime()` 和替代方案處理 1970 年之前的日期?
    strtotime() 和1970 年之前的日期由於範圍有限,使用strtotime() 處理1970 年之前的日期可能會帶來挑戰。要解決此問題,請檢查您的 PHP 版本和平台。如有必要,請考慮升級。 或者,為了更靈活地處理更廣泛的日期範圍,請考慮使用 PHP 的 DateTime 物件。它們允許日...
    程式設計 發佈於2024-11-18
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST數組:表單提交後使用var_dump檢查$_POST 陣列的內容。...
    程式設計 發佈於2024-11-18

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3