事务的并发读问题
  1. 脏读:读取到另一个事务未提交数据;
  2. 不可重复读:两次读取不一致;
  3. 幻读(虚读):读到另一事务已提交数据。
五大并发事务问题
  1. 因为并发事务导致的问题大致有 5 类,其中两类是更新问题,三类是读问题。
    (1)脏读(dirty read):读到未提交更新数据
    JDBC基础(13)_JDBC 事务隔离级别_事务隔离级别
    A 事务查询到了 B 事务未提交的更新数据,A 事务依据这个查询结果继续执行相关操作。但是接着 B事务撤销了所做的更新,这会导致 A 事务操作的是脏数据。(这是绝对不允许出现的事情)
    (2)虚读(幻读)(phantom read):读到已提交插入数据
    JDBC基础(13)_JDBC 事务隔离级别_数据库系统_02
    A 事务第一次查询时,没有问题,第二次查询时查到了B事务已提交的新插入数据,这导致两次查询结果不同。(在实际开发中,很少会对相同数据进行两次查询,所以可以考虑是否允许虚读)
    (3)不可重复读(unrepeatable read):读到已提交更新数据
    JDBC基础(13)_JDBC 事务隔离级别_更新数据_03
    不可重复读与虚读有些相似,都是两次查询的结果不同。后者是查询到了另一个事务已提交的新插入数据,而前者是查询到了另一个事务已提交的更新数据。
四大隔离级别
  1. 表格
    JDBC基础(13)_JDBC 事务隔离级别_更新数据_04

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

    你可能会说,选择 SERIALIZABLE,因为它最安全!没错,它是最安全,但它也是最慢的!而且也最容易产生死锁。四种隔离级别的安全性与性能成反比!最安全的性能最差,最不安全的性能最好!

  3. MySQL 的默认隔离级别为 REPEATABLE READ。
    Oracle 数据库支持 READ COMMITTED 和 SERIALIZABLE 这两种事务隔离级别。
    所以 Oracle 不支持脏读 ,Oracle 的默认隔离级别是 READ COMMITTED。

如有错误,欢迎指正!