今天来讲一讲MYSQL中的事务特性以及隔离机制和一些可能出现的问题
事务特性(ACID):
ACID 是数据库事务的四个关键特性的首字母缩写:
1、原子性(Atomicity):
事务中的所有操作要么全部执行成功,要么全部失败回滚,没有中间状态。这确保了事务的完整性。
2、一致性(Consistency):
事务在开始和结束时数据库的状态必须保持一致。这意味着在事务内部的操作不会破坏数据库的完整性。
3、隔离性(Isolation):
并发执行的事务之间应该互不干扰。一个事务在提交前,其所做的变更对其他事务是不可见的。
4、持久性(Durability):
一旦事务提交,其变更将被永久保存在数据库中,即使系统崩溃也不会丢失。
隔离机制和问题:
数据库隔离级别决定了多个事务之间的可见性
1、读未提交(Read Uncommitted):
最低级别的隔离,允许一个事务读取另一个事务未提交的数据。可能出现脏读、不可重复读和幻读问题。
2、读已提交(Read Committed):
允许一个事务只能读取另一个已提交事务的数据。可以防止脏读问题,但不可避免不可重复读和幻读问题。
3、可重复读(Repeatable Read):
保证在同一个事务中的查询返回一致的结果。防止脏读和不可重复读问题,但幻读问题仍可能出现。
4、串行化(Serializable):
最高级别的隔离,确保所有事务按顺序执行,避免了脏读、不可重复读和幻读问题。但会降低并发性能。
*脏读,不可重复读,幻读:
1、脏读(Dirty Read):
一个事务读取了另一个事务尚未提交的数据,如果另一个事务回滚,读取的数据就是无效的。
2、不可重复读(Non-repeatable Read):
在一个事务内,同一个查询在不同时间段内返回了不同的结果,通常是因为另一个事务修改了数据。
3、幻读(Phantom Read):
在一个事务内,同一个查询在不同时间段内返回了不同数量的行,通常是因为另一个事务插入、更新或删除了数据。
不同隔离级别的解决问题:
1、读未提交(Read Uncommitted):
不提供任何隔离,可能导致脏读、不可重复读和幻读问题。
2、读已提交(Read Committed):
解决了脏读问题,但仍可能出现不可重复读和幻读问题。
3、可重复读(Repeatable Read):
解决了脏读和不可重复读问题,但仍可能出现幻读问题。
4、可重复读(Repeatable Read):
解决了脏读和不可重复读问题,但仍可能出现幻读问题。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; #设置隔离级别为读未提交
---执行查询操作,观察可能的问题
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; #恢复默认隔离级别
如果想要测试不同隔离级别的影响,可以使用MYSQL中的 'SET TRANSACTION ISOLATION LEVEL'
命令来设置隔离级别,并进行一系列的操作来观察问题的发生情况,可参照以上操作进行。