事务隔离分为不同级别,包括读未提交(Read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
事务的隔离级别✘ | 脏读 | 不可重复读 | 幻读 |
读未提交(Read uncommitted) | ✔ | ✔ | ✔ |
读已提交(read committed) | ✘ | ✔ | ✔ |
可重复读(repeatable read) | ✘ | ✘ | ✔ |
串行化(Serializable)✔ | ✘ | ✘ | ✘ |
注意:在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行 命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
1、脏读:事务A读取了事务B更新的数据,B没有commit提交,然后B回滚操作rollback,那么A读取 到的数据是脏数据。
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提 交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在 这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生 了幻觉一样,这就叫幻读。
总结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重 复读的问题只需锁住满足条件的行,解决幻读需要锁表