什么是事务?
事务就是一次数据库操作中的若干单元的管理。
事务管理的目标是完整性,一次中的若干操作要么都执行成功,要么都执行失败。
事务管理的特征 ACID
- 原子性(Atomicity,或称不可分割性)
- 一致性(Consistency)
- 隔离性(Isolation,又称独立性)
- 持久性(Durability)
原子性
原子性就是要保证一次操作中的多条语句要么都执行,要么都不执行。
隔离性
隔离性就是要控制多个事务在并发读写时互不影响。
隔离级别有四种:
- 读未提交(read uncommitted)
- 读已提交(read committed)
- 可重复读(repeatable read)
- 串行化(Serializable)
持久性
持久性就是将数据持久化到硬盘中,不可回滚。
一致性
一致性就是保持数据操作的完整性。
事务的四个隔离级别
1.读未提交
一个事务可以读取到另一个事务未提交的数据。
可能出现的问题:
可能会出现脏读,另一个事务可能会回滚,这样读到的数据是脏数据。
2.读已提交
一个事务只能读取另一个事务已经提交的数据。
解决了脏读问题,但是会存在不可重复读问题。
例如:事务开始的时候读取到的一个数据为10,在此期间另一个事务将数据修改为20,并且提交了,此时事务再次查询,结果发生了改变,没有读到上次的数据,这种情况称为不可重复读。
3.可重复读
同一个事务中,多次读取相同的数据,返回的结果是一样的。
避免了脏读和不可重复读问题,但是除了 innodb 外幻读依旧存在。
4.串行化
事务进行串行执行,避免了问题的出现。
并发情况下,读操作可能存在的三类问题:
-
脏读:当前事务(A)中可以读到其他事务(B)未提交的数据(脏数据),这种现象是脏读。 -
不可重复读:在事务A中先后两次读取同一个数据,两次读取的结果不一样,这种现象称为不可重复读。脏读与不可重复读的区别在于:前者读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据。 -
幻读:在事务A中按照某个条件先后两次查询数据库,两次查询结果的条数不同,这种现象称为幻读。不可重复读与幻读的区别可以通俗的理解为:前者是数据变了,后者是数据的行数变了。
事务隔离级别的命令行操作
1.查看隔离级别:
SELECT @@global.transaction_isolation,@@transaction_isolation;
mysql 数据提供了4种不同的隔离级别,实际开发中就需要根据不同的场景需要选择不同的隔离级别。
除了串行化以外,其他级别都会存在某种问题。
2.设置隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
|