Mysql中的事务
文章参考:https://mp.weixin.qq.com/s/2cTptvB5BPKzo92FT1yQXA
- 什么是事务?
事务可以看成是一组原子性的SQL语句,事务中的语句,要么全部执行成功,要么全部执行失败。 - 事务相关的语法
BEGIN / START TRANSACTION 显式的开启事务
COMMIT / COMMIT WORK 事务提交
ROLLBACK / ROLLBACK WORK 事务回滚
SAVEPOINT point1 在事务中创建一个保存点,一个事务中可以创建多个保存点
ROLLBACK TO point1 将事务回滚到保存点point1
SET TRANSACTION isolation level 用来设计事务的隔离级别
- 事务的ACID特性
- 原子性(atomicity)
一个事务被看成一个不可拆分的整体,整个事务要么全部执行成功,要么全部执行失败,不可能只执行其中的一部分。 - 一致性(consistency)
事务在执行之前与之后,数据库都处于一致性状态。在事务提交之前,事务中对数据所作的修改不会保存到数据库中,只有正确执行所有语句,执行事务提交后,才会对数据进行修改。 - 隔离性(isolation)
一个事务的执行不能被其他事务干扰,事务与事务之间互不干扰,相互隔离。 - 持久性(durability)
一个事务一但提交成功,事务中对数据的修即是永久性的修改,即使发生故障或崩溃,只要数据库能够重新启动,修改后的数据也不会丢失。
- 四个隔离级别
- Read Uncommited 未提交读
所有事务都可以看到其他事务未提交的修改。 - Read Commited 提交读
一个事务只能看到其他已经提交的事务所做的变更。 - Repeatable Read 可重复读
确保同一个事务的多个实例在并发读取数据时会看到相同的数据行。 - Serializable 可串行化
最高的隔离级别,完全串行化读,事务串行执行,读取的每一行数据都加锁,会导致大量的超时和锁争用问题。
- 各个隔离级别是否能够发生脏读,不可重复和幻读。
- 脏读、不可重复读、幻读
- 脏读
比如事务A和B,当事务A对某条数据进行了修改,但尚未提交,事务B能够读取到事务A未提交但已修改的数据。
- 不可重复读
事务A和B,事务A对某条数据查询之后,事务B修改了该条数据,并且提交事务,此时事务A再次查询该条数据时,与第一次查询的结果不同。
- 幻读
事务A和B,事务A查询到符合条件的N条记录,事务B插入了一条新的记录或删除了一条记录,提交事务,此时事务A再次查询时会查询到N+1条或N-1条数据。
- MySql8的事务语句,MySql7中,把TRANSACTION ISOLATION 换成tx_isolation
- 设置当前会话的事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别
- 设计全局的事务隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别
- 查询当前会话的事务隔离级别
SELECT @@Session.TRANSACTION_ISOLATION
- 查询全局的事务隔离级别
SELECT @@Global.TRANSACTION_ISOLATION