mysql学习之旅(十二)——Mysql的事务

Mysql的事务

什么是事务

事务是由一个或多个SQL语句组成的一个不可分割的整体,SQL语句之间相互依赖,要么全都执行,要么全都不执行。

事务必须满足的四个条件:
Atomicity(原子性)
Consistency(一致性)
Isolation(隔离性)
Durability(持久性)

控制事务处理

ROLLBACK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
COMMIT:会提交事务,并使已对数据库进行的所有修改成为永久性的;
SAVEPOOINT identifier:允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOOINT;
ROLLBACK TO identifier:把事务回滚到标记点;

NYSQL处理事务主要有两种方法:
1、用BEGIN、ROLLBACK、COMMIT来实现
BEGIN或START TRANSACTION开始一个事务
ROLLBACK事务回滚
COMMIT事务确认
2、直接用SET来改变Mysql的自动提交模式:
SET AUTOCOMMIT=0禁止自动提交
SET AUTOCOMMIT=1开启自动提交

eg:
定义保存点并回滚到保存点:
BEGIN;
INSERT INTO mytest VALUES(4,‘test04’);
SAVEPOINT s1;
INSERT INTO mytest VALUES(5,‘test05’);
SAVEPOINT s2;
INSERT INTO mytest VALUES(6,‘test06’);
ROLLBACK TO s2;
COMMIT;

SELECT * FROM mytest;

或者
– 禁止事务的自动提交
SET autocommit=0;
INSERT INTO mytest VALUES(7,‘test07’);
ROLLBACK;
SELECT * FROM mytest;

只有COMMIT了一个事务,该事务才能被别的用户看到。

通过InnoDB使用事务

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID)。
MYSQL5.7中InnoDB作为默认存储引擎。所以事务处理正常处理就可以,但在MYSQL5.5之前MulSAM是默认存储引擎,当需要事务处理时需设置存储引擎为InnoDB。
案例:
在这里插入图片描述DELIMITER //
CREATE PROCEDURE borrowproc(cid CHAR(18),bid INT)
BEGIN
DECLARE store_num INT;
DECLARE money FLOAT(7,3);
SELECT store INTO store_num FROM bookinfo WHERE book_id =bid;
SELECT balance INTO money FROM readerinfo WHERE card_id =cid;
SELECT bid,cid,store_num,money;
SET autocommit=0;
INSERT INTO borrowinfo VALUES(bid,cid,CURDATE(),DATE_ADD(CURDATE(),INTERVAL 1 MONTH),‘否’);
UPDATE bookinfo SET store=store-1 WHERE book_id=bid;
UPDATE readerinfo SET balance =balance-(SELECT price FROM bookinfo WHERE book_id=bid)*0.05 WHERE card_id =cid;
IF store_num=0 OR money<=200 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END//
DELIMITER;
在这里插入图片描述

扫描二维码关注公众号,回复: 9347665 查看本文章
发布了19 篇原创文章 · 获赞 2 · 访问量 1233

猜你喜欢

转载自blog.csdn.net/weixin_38377637/article/details/100179113