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;