1. 程式人生 > >關於Navicat for mysql批量提交事務回滾的問題

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

-- 本人用的是mysql 5.7.20測試的

-- 引用:

-- http://blog.51cto.com/lujinxiong/1844769 Navicat for mysql 快捷鍵 

-- https://blog.csdn.net/ocean1010/article/details/6908064 查閱事務的輔助資料這個是關於mysql不是InnoDB引擎的問題
-- 方法一:這種一般配合java使用


#建立賬戶表  
CREATE TABLE IF NOT EXISTS account(  
  id INT(11)NOT NULL AUTO_INCREMENT PRIMARY KEY,  
  username VARCHAR(32)NOT NULL,  
  money DECIMAL(9,2)  
)ENGINE=INNODB;  
#插入使用者資料  
INSERT INTO account(username,money)VALUES('A',1000.00);  
INSERT INTO account(username,money)VALUES('B',200.00);  
  
/*事務處理*/  
#  A賬戶匯款失敗  
SELECT * FROM account;  
#第一步 關閉事務自動提交模式  
SET autocommit=0;  
#第二步 開始事務  
START TRANSACTION;  
#第三步 發現匯款失敗,將事務回滾ROLLBACK ||  匯款成功將事件commit  
#假設語法錯誤  
UPDATE account SET money=money-500 WHERE username='A';  
SELECT * FROM account;  
UPDATE account SET money=money+200 WHERE username='B';  
ROLLBACK;  
#第四步 還原Mysql資料庫的的自動提交  
SET autocommit=1;  
SELECT * FROM account;  
   
  
/*B接收匯款失敗*/  
SELECT *FROM account ;  
SET autocommit =0;  
START TRANSACTION;  
UPDATE account SET money=money-500 WHERE username='A';  
SELECT * FROM account ;  
#假設語法錯誤  
UPDATE account SET money=money+200 WHERE username ='B';  
ROLLBACK;  
SET autocommit =1;  
SELECT * FROM account;  
  
#清除資料  

TRUNCATE account;  

-- 引用:

#http://blog.51cto.com/chlotte/401986
#DELETE 在刪除資料的時候,系統需要記錄每一個命令,以便在需要時能夠撤回該命令,DELETE將需要使用表所佔用空間的兩倍.


#TRUNCATE在刪除資料的時候不記錄日誌.所需的時間比較快,所佔用的磁碟空間也比較小.


#DROP TABLE直接刪除表,而不是表中的資料.

-- 引用:

#https://blog.csdn.net/ssmdz/article/details/75385790

#https://www.cnblogs.com/fnlingnzb-learner/p/6861376.html

-- 方法二:1 .這種一般直接在Navicat for mysql中使用

#這種不用設定手動和自動提交事務

CREATE TABLE tran_test(  
f1 VARCHAR(10) NOT NULL,  
f2 INT(1) DEFAULT NULL,  
PRIMARY KEY (f1)  
)ENGINE=INNODB CHARSET=utf8  


DROP PROCEDURE IF EXISTS t_test;  
DELIMITER //  
CREATE PROCEDURE t_test()  
  BEGIN   
    DECLARE t_error INTEGER;  
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1;  
    START TRANSACTION;  --整個儲存過程指定為一個事務

         INSERT INTO tran_test VALUES('A',1);  
     INSERT INTO tran_test VALUES('B',2);  
         IF t_error = 1 THEN  
             ROLLBACK;  
         ELSE  
             COMMIT;  
         END IF;  
END//  
CALL t_test();  
-- 方法二:2 .這種一般直接在Navicat for mysql中使用 (上邊的簡化)
DROP PROCEDURE  IF EXISTS t_test;  
DELIMITER //  
CREATE PROCEDURE t_test()  
#SET autocommit =0; 
BEGIN  
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;  
START TRANSACTION;  
INSERT INTO tran_test VALUES('G',3);  
INSERT INTO tran_test VALUES('H',4);  
COMMIT;  
#SET autocommit =1; 
END//  
CALL t_test() 
-- 檢視是否手動開啟手動提交(引數autocommit=0),自動開啟自動提交(引數autocommit=1)
-- show session variables like 'autocommit';
-- +---------------+-------+
-- | Variable_name | Value |
-- +---------------+-------+
-- | autocommit    | ON    |
-- +---------------+-------+
-- 
--  show global variables like 'autocommit';
--  set session autocommit=0;
-- show session variables like 'autocommit';
--  show global variables like 'autocommit';
-- +---------------+-------+
-- | Variable_name | Value |
-- +---------------+-------+
-- | autocommit    | ON    |
-- +---------------+-------+
-- set global autocommit=0;
--  show global variables like 'autocommit';
--  show variables like 'autocommit';
-- +---------------+-------+
-- | Variable_name | Value |
-- +---------------+-------+
-- | autocommit    | ON    |
-- +---------------+-------+
-- set autocommit=0;
--  delete from MyDB.test where name='kerry';
-- SHOW VARIABLES LIKE '%AUTOCOMMIT%';


select * from tran_test