事务
6.1 什么是事务
要么都成功,要么都失败。
-
SQL执行 A给B 转账 A 1000 ------> B 200
-
SQL执行 B收到A的钱 A 800 -------> B 400
将一组SQL放在一分批次去执行
事务原则:ACID原则
参考博客:事务ACID理解_dengjili的博客-CSDN博客_acid
原子性(Atomicity)
原子性是指事务中一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
一致性(Consistency)
事务前后的数据完整性要保持一致
持久性(Durability) ------事务提交
事务一旦提交则不可逆,被持久化到数据库中
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
事务并发导致的问题
脏读
指一个事务读取了另外一个事务未提交的数据
不可重复读
在一个事务中内读取表中的某一行数据,多次读取结果不同(这个不一定是错误,只是某些场合不对)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
(一般是行影响)
读未提交:一个事务读取到其他事务未提交的数据;这种隔离级别下,查询不会加锁,一致性最差,会产生脏读、不可重复读、幻读的问题
读已提交:一个事务只能读取到其他事务已经提交的数据;该隔离级别避免了脏读问题的产生,但是不可重复读和幻读的问题仍然存在;
读提交事务隔离级别是大多数流行数据库的默认事务隔离级别,比如 Oracle,但是不是 MySQL 的默认隔离界别
可重复读:事务在执行过程中可以读取到其他事务已提交的新插入的数据,但是不能读取其他事务对数据的修改,也就是说多次读取同一记录的结果相同;该个里级别避免了脏读、不可重复度的问题,但是仍然无法避免幻读的问题
6.2 测试事务准备转账
==========事务============
mysql是默认开启事务自动提交的
SET autocommit = 0 //关闭
SET autocommit = 1 //开启
手动开启事务
SET autocommit = 0 //关闭自动提交
---事务开启
START TRANSACTION ---标记一个事务的开始,从这之后的sql都在同一个事务中
insert ...
insert ...
--提交,持久化(成功!)
COMMIT
--回滚:回到原来的样子(失败!)
ROLLBACK
--事务结束
SET autocommit = 1 //开启自动提交
---了解
SAVEPOINT 保存点名称 --设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名称 --回滚到保存点
RELEASE SAVEPOINT 保存点 --撤销保存点