文章目录
- 事务基础知识
- 什么是事务?
- 开启事务
- 事务隔离级别
事务基础知识
在MySQL中,只有InnoDB存储引擎是支持事务的。
什么是事务?
事务是逻辑操作的最小单元,使数据从一个状态转变为另一个状态。
也可以通过事务四大特性ACID来更深刻地了解事务
A :原子性【事务不可再分,是最小单元。要么全部提交,要么全部回滚】
C:一致性【执行事务前后,数据从一个合法状态变换为另一个合法状态,就满足了一致性的需求】
I:隔离性【两个事务不互相干扰】
D:持久性【事务一旦提交,对数据库中的数据改变就是永久性的】
开启事务
显式事务: START TRANSACTION
或者 BEGIN
隐式事务:MySQL中的系统变量autocommit,默认为TRUE,如果设置为FALSE,则开启了隐式事务。
隐式提交事务的情况:使用数据定义语言DDL(比如TRUNCATE TABLE ——删除表中数据)、隐式使用或修改mysql数据库中的表、事务控制或关于锁定的语句(比如使用 LOCK TABLES 、 UNLOCK TABLES 等关于锁定的语句也会 隐式的提交 前边语句所属的事务)
事务隔离级别
并发中可能发生如下问题:
-
脏写:SessionA修改了SessionB修改后未提交的数据。
-
脏读:SessionA读取了SessionB修改后为提交的数据,SessionB此时回滚,SessionA读取到的内容就是无效的。
-
不可重复读:SessionA读取了一个字段,SessionB对字段进行修改后,SessionA再次读取该字段,与之前的值不一致,就发生了不可重复读。
-
幻读:SessionA从表中读取一个字段,SessionB对表进行操作,在表中插入了一条新的数据。SessionA再次查询该表时,就会出现一些之前没有的新纪录,这种情况就是幻读。新插入的记录被称为幻影记录。
有些时候,我们愿意舍弃隔离性来换取一些高并发的性能,SQL标准中设立了4个隔离级别。
- READ UNCOMMITTED :读未提交。所有事务都可以读取其他事务未提交的数据。隔离级别最低,但并发性能最高。
- READ COMMITTED:读已提交。满足隔离的简单定义,一个事务只能读取其他事务已经提交的数据。可以避免脏读。
- REPETABLE READ :可重复读。SessionA读取了一个字段,SessionB对字段进行修改后,SessionA再次读取该字段时读取到与之前一致的值。避免了脏读、不可重复读。是MySQL的默认隔离级别。
- SERIALIZABLE:可串行化。确保事务可以从一个表中读取相同的行。具体原理为,在事务持续期间,禁止其他事务对表进行任何操作。隔离级别最高,但性能很低。避免了脏读、不可重复读、幻读。
图:隔离级别与并发性能的关系。
设置隔离级别:
SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别'
#其中,隔离级别格式:
> READ-UNCOMMITTED
> READ-COMMITTED
> REPEATABLE-READ
> SERIALIZABLE
# GOLBAL : 在全局范围内影响。 SESSION : 只在当前会话有效。