12.事务

事务:

将一组SQL放在一个批次中去执行

原则:ACID  

原子性:要么都成功,要么都失败

一致性:事务前后的数据完整要保持一致,最终一致性

隔离性:是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,事务之间要相互隔离

        隔离导致的问题:

        

脏读:一个事务读取了另一个事务没有提交的数据

不可重读:在一个事务内读取表中的某一行数据,多次读取结果不同

虚读(幻读):是指在一个事务内读取都了别的事务插入的数据,导致前后读取不一致

 

持久性:事务一旦提交就不可逆,被持久化到数据库中

===================

测试事务实现转账

mysql自动开始事务自动提交的

SET autocommit=0; /*关闭*/

SET autocommit=1; /*开启*/

--手动处理事务

--事务开启,从这之后的SQL都在同一个事务内

START TRANSACTION

 

提交:持久化(成功) commit

回滚:回到原来的样子(失败)

--事务结束

SET autocommit=1 /*开启自动提交

 

保存点名--设置一个事务的保存点

SAVEPOINT

ROLLBACK TO SAVEPOINT 回滚保存点

删除保存点 RELEASE SAVEPOINT

CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
CREATE TABLE `account`(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO ACCOUNT(`name`,`money`) VALUES ('A',2000.00),('B',1000.00)

 

转账模拟
SET autocommit=0;  --关闭自动事务
START TRANSACTION   --开启一个事务

一组事务:
UPDATE ACCOUNT SET money=money-500 WHERE NAME='A'  --A减500

UPDATE ACCOUNT SET money=money+500 WHERE NAME='B'  --B加500


COMMIT;  --提交事务

ROLLBACK;  --回滚事务

SET autocommit=1;  --恢复默认值

posted @ 2021-05-26 15:32  白语  阅读(39)  评论(0)    收藏  举报