MySQL数据库的事务与存储引擎(第十二章)

1 事务的介绍

MySQL数据库的事务与存储引擎(第十二章)_第1张图片
MySQL数据库的事务与存储引擎(第十二章)_第2张图片
MySQL数据库的事务与存储引擎(第十二章)_第3张图片
MySQL数据库的事务与存储引擎(第十二章)_第4张图片
演示事务的一些操作:
创建一张表mytest:

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中的数据:
MySQL数据库的事务与存储引擎(第十二章)_第5张图片
回滚操作演示:
再向表mytest中插入一条数据:

BEGIN;
INSERT INTO mytest(id, NAME) VALUES(3, 'test03');

再查看表中数据:
MySQL数据库的事务与存储引擎(第十二章)_第6张图片
进行回滚操作:

-- 回滚事务
ROLLBACK;

查看表中数据会发现之前插入的那条数据没有插入成功!
MySQL数据库的事务与存储引擎(第十二章)_第7张图片
注意:回滚事务的操作的前提是事务还没有提交,如果事务已经提交,那么回滚事务的操作就会失败!
事务提交之前,进行回滚事务的操作时,我们也可以自定义还原点,让事务回滚到之前的某个状态。

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中数据:
MySQL数据库的事务与存储引擎(第十二章)_第8张图片
查看数据会发现:id为6的这条数据没有插入成功,这就是自定义还原点的用途。
也可以通过以下方式开启手动提交事务:

-- 开启手动事务
SET autocommit = 0;
INSERT INTO mytest VALUES(7, 'test07');
-- 还没提交就可以成功回滚事务
ROLLBACK;

查看表中数据:
MySQL数据库的事务与存储引擎(第十二章)_第9张图片
手动提交事务:

-- 开启手动事务
SET autocommit = 0;
INSERT INTO mytest VALUES(8, 'test08');
-- 提交事务
COMMIT;

查看表数据:
MySQL数据库的事务与存储引擎(第十二章)_第10张图片

2 通过InnoDB使用事务

MySQL数据库的事务与存储引擎(第十二章)_第11张图片
MySQL数据库的事务与存储引擎(第十二章)_第12张图片
在操作前我们先查看3张表中的数据:

SELECT * FROM borrowinfo;
SELECT * FROM bookinfo;
SELECT * FROM readerinfo;

借阅信息表borrowinfo:
MySQL数据库的事务与存储引擎(第十二章)_第13张图片
图书信息表bookinfo:
MySQL数据库的事务与存储引擎(第十二章)_第14张图片
读者信息表readerinfo:
MySQL数据库的事务与存储引擎(第十二章)_第15张图片

-- 使用存储过程实现上述要求
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);

然后再次查看3张表中数据:
MySQL数据库的事务与存储引擎(第十二章)_第16张图片
如果我们再次调用存储过程:

CALL borrowProcedure('210210199901017777', 20151101);

调用存储过程之后再查看3张表会发现表中的数据没变。为什么呢?这是因为身份证号为"210210199901017777"的这位读者的余额<=200,引发了事务回滚操作。

3 存储引擎的介绍

MySQL数据库的事务与存储引擎(第十二章)_第17张图片
MySQL数据库的事务与存储引擎(第十二章)_第18张图片
可以通过以下方式查看MySQL的默认存储引擎:

-- 查看MySQL的默认存储引擎
SHOW VARIABLES LIKE 'default_storage_engine';

结果:
MySQL数据库的事务与存储引擎(第十二章)_第19张图片
MySQL数据库的事务与存储引擎(第十二章)_第20张图片
通过以下方式查看MySQL支持的存储引擎:

-- 查看数据库的存储引擎信息
SHOW ENGINES;

结果:
MySQL数据库的事务与存储引擎(第十二章)_第21张图片
MySQL数据库的事务与存储引擎(第十二章)_第22张图片
MySQL数据库的事务与存储引擎(第十二章)_第23张图片
MySQL数据库的事务与存储引擎(第十二章)_第24张图片

4 如何设置存储引擎

MySQL数据库的事务与存储引擎(第十二章)_第25张图片
MySQL数据库的事务与存储引擎(第十二章)_第26张图片
配置文件my.ini一般是在系统盘C盘的ProgramData文件夹下,如果找不到,则说说明该文件夹被隐藏了,进行如下操作:
MySQL数据库的事务与存储引擎(第十二章)_第27张图片
然后找到配置文件my.ini文件:
MySQL数据库的事务与存储引擎(第十二章)_第28张图片
找到my.ini文件,打开后进行如下设置:
MySQL数据库的事务与存储引擎(第十二章)_第29张图片
设置好存储引擎之后,使用cmd打开windows的dos窗口,重启MySQL服务:
MySQL数据库的事务与存储引擎(第十二章)_第30张图片
此时再次查看MySQL的存储引擎:

show variables like 'default_storage_engine';

结果:
MySQL数据库的事务与存储引擎(第十二章)_第31张图片
会发现,MySQL的存储引擎已经变为MyISM了。
MySQL数据库的事务与存储引擎(第十二章)_第32张图片

-- 设置客户端的存储引擎
SET default_storage_engine = MYISAM;

结果:
MySQL数据库的事务与存储引擎(第十二章)_第33张图片
注意:SET方式只能在此次连接中有效,如果关闭连接再次登录数据库,会发现之前设置的储存引擎已经失效。
MySQL数据库的事务与存储引擎(第十二章)_第34张图片

-- 创建表的同时设置存储引擎
CREATE TABLE storageTest(
id INT PRIMARY KEY,
NAME VARCHAR(20)
)ENGINE=MYISAM DEFAULT CHARSET = utf8;
-- 查看表的存储引擎信息
SHOW TABLE STATUS FROM book WHERE NAME = 'storageTest';

结果:
MySQL数据库的事务与存储引擎(第十二章)_第35张图片
MySQL数据库的事务与存储引擎(第十二章)_第36张图片

-- 更改表的存储引擎
ALTER TABLE storageTest ENGINE = INNODB;

然后查看表的存储引擎:
MySQL数据库的事务与存储引擎(第十二章)_第37张图片

你可能感兴趣的:(MySql入门教程)