MySql事务
-
什么是事务,事务的四大特性(ACID)?
- 原⼦性「Atomicity」:每个事务都是⼀个整体,不可再拆分,事务中所有的 SQL 语句要么都执⾏成功,要么都失败。
- ⼀致性「Consistency」:
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
即为事务操作前后,数据总量不变
换一种方式理解就是:事务按照预期生效,数据的状态是预期的状态。
举例说明:张三向李四转100元,转账前和转账后的数据是正确的状态,这就叫一致性,如果出现张三转出100元,李四账号没有增加100元这就出现了数据错误,就没有达到一致性 - 隔离性「Isolation」:事务与事务之间不应该相互影响,执⾏时保持隔离的状态。
- 持久性「Durability」:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的
即为一段代码块在执行过程中同时结束并不报错,要么同时成功,要么同时失败
-
为什么需要事务?
为了考虑数据的安全性,比如转账时,付款和收款要同时成功
-
事务怎么使用?
-- 声明事务 start transaction; sql 1, sql 2, ..... commit; -- 提交事务 -- 如果上述代码中有错误则回滚 rollback; -- 回滚点,如上述代码 sql1,sql2 如果执行失败回滚需要从 sql1 开始 如果想从别的地方开始可以给 sql语句之间添加回滚点 -- 如下 start transaction; sql 1, sql 2, savepoint R1; sql 3, ..... commit; rollback R1; -- 回滚后 事务将从 sql 3开始执行
MySQL隔离级别
- 读未提交 产生 : 脏读 ,不可重复读,幻读
- 读已提交 解决了 脏读 存在:不可重复读 ,幻读
- 可重复读 解决了 脏读,不可重复读 存在: 幻读
- 串行化 解决所有
-- 脏读
事务与事务之间的隔离性最低,事务A可以读到别的事务未提交的数据
-- 不可重复读
事务A只能读到别的事务 提交的数据 数据总量是一致的
-- 幻读
同时开启事务A,B 当A插入一条数据, B也执行插入语句,B执行失败,因为主键唯一,但是B读取不到A插入的那条数据
-
读未提交 产生问题,脏读 不可重复读 幻读
A,B同时开启事务 A可以读到 B未提交的数据
如上图,A,B均操作临时库 所产生的数据均从临时库读取,所以有脏读现象
-
读已提交 解决了脏读问题
A,B同时开启事务 开启事务,相当于创建了一块临时空间,用来存储数据库中的数据
如果没有提交事务,则该临时空间内修改的数据,仅限于内存中,并不会持久化到数据库中
-
可重复读 解决了 不可重复读问题
-
串行化 解决幻读问题
什么是幻读,即为上述图,A事务 插入了一条数据student id为1 , 当B也想插入这条数据时,失败 ,但是查询结果为空。即出现了幻觉,这条数据在临时库查不到,但确实持久化到了数据库中
串行化,就是排队,事务A结束,才能开启事务B
相关代码
-- 查询隔离级别:
select @@tx_isolation;
selelect @@transaction_isolation; # 8.0版本的命令;
-- 设置隔离级别
set global transaction isolation level read uncommitted;
-- 开启事务
start transaction;
-- 隔离级别
read uncommitte --读未提交
read committed -- 读已提交 (Oracle)
repeatable read -- 可重复读 (MySQL默
serializable --串⾏化可以解决所有的问题