-- 本人用的是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