create table mytest(
id int primary key,
name varchar(20)
);
向表mytest中添加两条数据:
BEGIN;
INSERT INTO mytest(id, NAME) VALUES(1, 'test01');
INSERT INTO mytest(id, NAME) VALUES(2, 'test02');
COMMIT;
此时查看表mytest中的数据:
回滚操作演示:
再向表mytest中插入一条数据:
BEGIN;
INSERT INTO mytest(id, NAME) VALUES(3, 'test03');
-- 回滚事务
ROLLBACK;
查看表中数据会发现之前插入的那条数据没有插入成功!
注意:回滚事务的操作的前提是事务还没有提交,如果事务已经提交,那么回滚事务的操作就会失败!
事务提交之前,进行回滚事务的操作时,我们也可以自定义还原点,让事务回滚到之前的某个状态。
BEGIN;
INSERT INTO mytest(id, NAME) VALUES(4, 'test04');
-- 定义事务的还原点s1
SAVEPOINT s1;
INSERT INTO mytest(id, NAME) VALUES(5, 'test05');
-- 定义事务的还原点s2
SAVEPOINT s2;
INSERT INTO mytest(id, NAME) VALUES(6, 'test06');
-- 定义事务的还原点s3
SAVEPOINT s3;
-- 还原到还原点s2
ROLLBACK TO s2;
-- 提交事务
COMMIT;
查看表mytest中数据:
查看数据会发现:id为6的这条数据没有插入成功,这就是自定义还原点的用途。
也可以通过以下方式开启手动提交事务:
-- 开启手动事务
SET autocommit = 0;
INSERT INTO mytest VALUES(7, 'test07');
-- 还没提交就可以成功回滚事务
ROLLBACK;
-- 开启手动事务
SET autocommit = 0;
INSERT INTO mytest VALUES(8, 'test08');
-- 提交事务
COMMIT;
SELECT * FROM borrowinfo;
SELECT * FROM bookinfo;
SELECT * FROM readerinfo;
借阅信息表borrowinfo:
图书信息表bookinfo:
读者信息表readerinfo:
-- 使用存储过程实现上述要求
DELIMITER //
CREATE PROCEDURE borrowProcedure(IN cardId CHAR(18), IN bookId INT)
BEGIN
DECLARE store_num INT;
DECLARE money FLOAT(7, 3);
SELECT store INTO store_num FROM bookinfo WHERE book_id = bookId;
SELECT balance INTO money FROM readerinfo WHERE card_id = cardId;
-- 开启手动事务
SET autocommit = 0;
-- 插入一条借阅信息
INSERT INTO borrowinfo VALUES(bookId, cardId, CURDATE(), DATE_ADD(CURDATE(), INTERVAL 3 MONTH), '否');
-- 更新图书信息表
UPDATE bookinfo SET store = store - 1 WHERE book_id = bookId;
-- 更新读者信息表
UPDATE readerinfo SET balance = balance - (SELECT price FROM bookinfo WHERE book_id = bookId) * 0.05 WHERE card_id = cardId;
-- 判断库存和读者金额
IF store_num = 0 OR money <= 200 THEN
-- 回滚事务(库存和金额不符合要求)
ROLLBACK;
ELSE
-- 提交事务(库存和金额符合要求)
COMMIT;
END IF;
END //
DELIMITER ;
调用存储过程:
-- 调用存储过程
CALL borrowProcedure('210210199901014444', 20151101);
CALL borrowProcedure('210210199901017777', 20151101);
调用存储过程之后再查看3张表会发现表中的数据没变。为什么呢?这是因为身份证号为"210210199901017777"的这位读者的余额<=200,引发了事务回滚操作。
-- 查看MySQL的默认存储引擎
SHOW VARIABLES LIKE 'default_storage_engine';
-- 查看数据库的存储引擎信息
SHOW ENGINES;
配置文件my.ini一般是在系统盘C盘的ProgramData
文件夹下,如果找不到,则说说明该文件夹被隐藏了,进行如下操作:
然后找到配置文件my.ini文件:
找到my.ini文件,打开后进行如下设置:
设置好存储引擎之后,使用cmd
打开windows的dos窗口,重启MySQL服务:
此时再次查看MySQL的存储引擎:
show variables like 'default_storage_engine';
-- 设置客户端的存储引擎
SET default_storage_engine = MYISAM;
结果:
注意:SET方式只能在此次连接中有效,如果关闭连接再次登录数据库,会发现之前设置的储存引擎已经失效。
-- 创建表的同时设置存储引擎
CREATE TABLE storageTest(
id INT PRIMARY KEY,
NAME VARCHAR(20)
)ENGINE=MYISAM DEFAULT CHARSET = utf8;
-- 查看表的存储引擎信息
SHOW TABLE STATUS FROM book WHERE NAME = 'storageTest';
-- 更改表的存储引擎
ALTER TABLE storageTest ENGINE = INNODB;