13、JDBC 教程 - JDBC 事务隔离级别

事务的并发读问题

1、 脏读:读取到另一个事务未提交数据;
2、 不可重复读:两次读取不一致;
3、 幻读(虚读):读到另一事务已提交数据;

五大并发事务问题

1、 因为并发事务导致的问题大致有5类,其中两类是更新问题,三类是读问题;

(1)脏读(dirty read):读到未提交更新数据

 

A 事务查询到了 B 事务未提交的更新数据,A 事务依据这个查询结果继续执行相关操作。但是接着 B事务撤销了所做的更新,这会导致 A 事务操作的是脏数据。(这是绝对不允许出现的事情)

(2)虚读(幻读)(phantom read):读到已提交插入数据

 

A 事务第一次查询时,没有问题,第二次查询时查到了B事务已提交的新插入数据,这导致两次查询结果不同。(在实际开发中,很少会对相同数据进行两次查询,所以可以考虑是否允许虚读)

(3)不可重复读(unrepeatable read):读到已提交更新数据

 

不可重复读与虚读有些相似,都是两次查询的结果不同。后者是查询到了另一个事务已提交的新插入数据,而前者是查询到了另一个事务已提交的更新数据。

四大隔离级别

1、 表格;

 

2、 哪种隔离级别最好?;
4 个等级的事务隔离级别,在相同数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力是不同的。
SERIALIZABLE(串行化)
当数据库系统使用 SERIALIZABLE 隔离级别时,一个事务在执行过程中完全看不到其他事务对数据库所做的更新。当两个事务同时操作数据库中相同数据时,如果第一个事务已经在访问该数据,第二个事务只能停下来等待,必须等到第一个事务结束后才能恢复运行。因此这两个事务实际上是串行化方式运行。
REPEATABLE READ(可重复读)
当数据库系统使用 REPEATABLE READ 隔离级别时,一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。
READ COMMITTED(读已提交数据)
当数据库系统使用 READ COMMITTED 隔离级别时,一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且还能看到其他事务已经提交的对已有记录的更新。
READ UNCOMMITTED(读未提交数据)
当数据库系统使用 READ UNCOMMITTED 隔离级别时,一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且还能看到其他事务没有提交的对已有记录的更新。

你可能会说,选择 SERIALIZABLE,因为它最安全!没错,它是最安全,但它也是最慢的!而且也最容易产生死锁。四种隔离级别的安全性与性能成反比!最安全的性能最差,最不安全的性能最好! 3、 MySQL的默认隔离级别为REPEATABLEREAD;
Oracle 数据库支持 READ COMMITTED 和 SERIALIZABLE 这两种事务隔离级别。
所以 Oracle 不支持脏读 ,Oracle 的默认隔离级别是 READ COMMITTED。