1. 程式人生 > >MySQL儲存過程事務回滾

MySQL儲存過程事務回滾

SQL過程程式碼:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `test_procedure`() BEGIN DECLARE errno int; declare continue HANDLER for sqlexception begin rollback; set errno=1; end; start transaction; set errno=0; insert into test(name) values
('kaka'); insert into test(id, name) values(1,'papa'); commit; select errno; END

過程說明:

1、首先表中已經存在一條記錄(1,'baby');

2、呼叫測試儲存過程;

3、該過程首先宣告error變數,和一個SQL異常處理handler,該handler觸發時會回滾事務,並將error置為1;

事務開始,將error置為0,插入一條資料name為‘kaka’,再插入一條資料(1,'papa'),然後提交;

但第二次插入資料時,主鍵id已存在,此處會報異常觸發我們的SQL異常處理handler。實現回滾並將error置為1;

檢視error值;

4、呼叫儲存過程之後檢視測試表中的資料是否回滾;

呼叫前:

\

呼叫中:

\

呼叫後:

\
建庫SQL:

?
1 2 3 4 5 6 7 8 CREATE DATABASE  IF NOT EXISTS `test`; USE `test`; DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5
DEFAULT CHARSET=utf8;

綜上,可以通過在儲存過程中宣告異常處理handler使得我們的事物達到回滾效果

來自:http://www.2cto.com/database/201506/404337.html

相關推薦

MySQL儲存過程事務

SQL過程程式碼: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `test_procedure`

Mysql儲存過程

在Mysql資料據中建立儲存過程執行多條SQL語句,當遇到問題時將所有的執行都回滾,這樣儲存過程就實現了事物操作。 實現過程:定義一個變數t_error初始值為0,再宣告一條語句,如果執行SQL的時候捕獲到異常,設定t_error的值為1,在儲存過程前設定 autocomm

MySQL的rollback--事務

MySQL version:5.7 首先:事務回滾只用於DML,不適用於DDL。對於DDL的回滾,以後有時間再說。 關於rollback和commit,MySQL的文件已經說的很詳細了,選擇其中一個簡單的例子再絮叨下: mysql> CREATE TABLE custom

關於Navicat for mysql批量提交事務的問題

-- 本人用的是mysql 5.7.20測試的-- 引用:-- http://blog.51cto.com/lujinxiong/1844769 Navicat for mysql 快捷鍵 -- https://blog.csdn.net/ocean1010/article/

MySQL儲存過程 事務transaction

Mysql中,單個Store Procedure(SP)不是原子操作,而oracle則是原子的。如下的儲存過程,即使語句2失敗,語句1仍然會被commit到資料庫中: create table testproc(id int(4) primary key, name

Mysql存儲過程中的事務

異常 procedure mysq span val com cnblogs 事務 erro create procedure test(in a int) BEGIN DECLARE t_error INTEGER DEFAULT 0;

MySql儲存過程捕獲異常

DROP PROCEDURE IF EXISTS pro_test;CREATE PROCEDURE pro_test(    para_a varchar(50),    para_b varchar(50))BEGIN    DECLARE result_code INT

mysql儲存過程以"陣列"形式入參實現表間複製 並實現

這個程式碼是我需要實現,前端稽核某個稽核後,這個資料會在另一個頁面中呈現,涉及到兩個資料庫表。一下內容是用於測試的程式碼。 前端進行處理,將id封裝成陣列後提交到Java後臺,"陣列"使用 - 來分隔,是因為入參時,我使用了逗號,但是測試失敗了,就改用-或空格 在點提交後

mysql事務

技術分享 default null 刪除 inf nod .com efault 人員 mysql使用事務前需確定存儲引擎為innodb,譬如刪除一個人員數據,會刪除和這個人有關的一些數據刪除,這個時候就會用到事務,出現一個刪除錯誤整個刪除事務就會取消。 事務回滾步驟: /

mysql儲存過程迴圈事務插入資料

DROP PROCEDURE IF EXISTS insertTUserStatement; create procedure insertTUserStatement(IN num int) begin declare i int; start transac

mysql 事務

事務的四個特性ACID,原子性,一致性,隔離性,永續性, 開始一個事務: ->begin;或者start transaction; ->sql語句 ->savepoint identifier,(建立一個儲存點) ->commit;或者rollback;

mysql事務機制概述

應用場景:   銀行取錢,從ATM機取錢,分為以下幾個步驟       1 登陸ATM機,輸入密碼;     2 連線資料庫,驗證密碼;     3 驗證成功,獲得使用者資訊,比如存款餘額等;     4 使用者輸入需要取款的金額,按下確認鍵;     5 從後臺資料庫中減

MySQL事務rollback與提交commit的操作

1.>D: 2.>cd program files\mysql\bin 3.>mysql -uroot -p123456 4.>show databases; 5.&

Transactional 事務 分析

transactionalSpring的AOP事務管理默認是針對unchecked exception回滾(運行期異常,Runtime Exception)。  unchecked ,就是不用手工寫try catch的exception  Exception作為基類,下面還分checked exception

Mysql儲存過程8:repeat循環

local cal 其他 host ted query code class pan 語法: repeat SQL until 條件 end repeat; 就是相當於其他語言中的: do{ # }while(); mys

Mysql儲存過程4:mysql變量設置

from 默認 pan procedure weight use mysql變量 sql 寫法 默認全局變量是兩個@@開頭, 可用show variables查看所有默認變量: @@user #declare定義變量只能用在儲存過程中 #declare 變量名 數據類型

Mysql儲存過程3:if語句

sql語句 inpu arguments ted div mysql then for clas --if/else語句 if 條件 then SQL語句 else SQL語句elseifSQL語句 end if; create procedure test1( n

Mysql儲存過程2:變量定義與參數傳遞

變量定義 color ted lec mysq 傳遞 參數傳遞 fault 可選 #儲存過程 中的變量定義 declare 變量名 類型 可選類型 -- 跟建表差不多 create procedure p() begin declare age int de

Spring 實現部分事務

light back true prop 回滾 sage .class lba aaa 例如有業務需求,在catch異常後,catch塊內把異常的信息存入到數據庫,而catch外的數據全部回滾 try { ....... aaaService.save();

的意義---JDBC事務探究

final cti span net etc rom tle img round JDBC手動事務提交回滾的常見寫法一直是rollback寫在commit的catch之後: try{ conn.setAutoCommit(false);   ps.execu