什么是事务?
要么都成功 要么都失败
————————————————————————
SQL执行 A 给 B 转账 A 1000—>B 200 A 800
SQL执行 B 收到 A 的钱 B 200
———————————————————————-
将一组SQL放在一个批次去执行
INNODB表支持事务
MYISAM 新版本也支持事务
事务原则 ACID原则
- 原子性:针对同一事物 要么都完成 要么都不完成
- 一致性:事务前后的数据完整性要保持一致
- 持久性:事务一旦提交不可逆,被持久化到数据库中
- 隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,事物之间要相互隔离
隔离所导致的问题
- 脏读:一个事务读取了另一个事务未提交的数据
- 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同
- 幻读:在一个事务内读取了别的事务插入的数据,导致前后读取不一致
执行事务
--mysql 是默认开启事务自动提交的SET autocommit=0 /*关闭*/SET autocommit=1 /*开启(默认)*/--手动处理事务SET autocommit=0 /*关闭自动提交*/--事务开启、START TRANSACTION /*标志一个事务的开始 从这之后的sql 都在一个事务内*/--提交,持久化(成功)COMMIT--回滚,回到原来的样子(失败)ROLLBACK--事务结束SET autocommit /*开启自动提交*/--了解SAVEPOINT 保存点名 --设置一个事务的保存点ROLLBACK TO SAVEPOINT /*回滚到保存点*/RELEASE SAVEPOINT 撤销保存点
模拟场景
--创建数据库并设置编码格式CREATE DATABASE shop CHARSET=utf8 COLLATE utf8_general_ci;USE shopCREATE TABLE `account`(`id` INT(4) NOT NULL AUTO_INCREMENT,`name` VARCHAR(20) NOT NULL,`money` DECIMAL(9,2) NOT NULL,PRIMARY KEY(`id`))ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO `account`(`name`,`money`)VALUES('A','10000'),('B','1000');--模拟转账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
