关于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

你可能感兴趣的:(mysql,数据库)