關於Navicat for mysql批量提交事務回滾的問題
阿新 • • 發佈:2019-01-25
-- 本人用的是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