事务隔离的四个级别分别是:
读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
-
读未提交(Read Uncommitted):这是最低的隔离级别,允许事务读取尚未提交的数据(即脏读)。这种级别虽然允许事务读取未提交的数据,但不允许更新丢失。如果一个事务已经开始写数据,则其他事务则不允许同时进行写操作,但允许其他事务读此行数据。
-
读提交(Read Committed):在这个级别下,一个事务只能读取已经提交的数据,避免了脏读,但可能会遇到不可重复读的问题。这意味着在一个事务内多次读取同一数据,可能会得到不同的结果,因为其他事务可以对数据进行修改并提交。
-
可重复读(Repeatable Read):在此级别下,一个事务在其执行过程中可以多次读取同一数据,并且能保证读取的数据在事务结束前不会被其他事务修改,避免了不可重复读的问题。但是,仍然可能遇到幻读问题。
-
串行化(Serializable):这是最高的隔离级别,要求所有事务串行执行,从而避免了脏读、不可重复读和幻读的问题。这种级别虽然可以保证数据的一致性,但会严重影响并发性能。
不同隔离级别下的并发问题
- 脏读:一个事务读取了另一个事务未提交的数据。例如,父亲在转账时未提交事务,儿子查询账户时看到了未提交的转账信息。
- 不可重复读:一个事务多次读取同一数据,但每次读取的结果不同。例如,儿子在父亲转账过程中多次查询账户余额,发现余额不断变化。
- 幻读:在一个事务中,两次执行相同的查询,第二次查询结果中出现了第一次查询中没有的数据行,或者缺少了第一次查询中的数据行。例如,儿子在查询账户时,发现突然多了或少了某些交易记录。