事务

文章目录

  • 1事务的隔离级别
    • 1.1Read uncommitted (读未提交):
    • 1.2 Read committed (读已提交)
      • 1.2.1 防止脏读
      • 1.2.2 不可重复读
    • 1.3 Repeatable read (可重复读)
    • 1.4 Serializable (串行化)
    • 1.5

1事务的隔离级别

1.1Read uncommitted (读未提交):

读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。最低级别,任
何情况都无法保证。
事务_第1张图片

事务_第2张图片
在第一个事务: 1000-50=950没提交时候,第二个事务就查出了950.(还未提交就查出了更新后的数据),随后第二个事务有减去50 =900
但是当一个事务提交之后,第二个事务查出了950

===》 脏读了

1.2 Read committed (读已提交)

顾名思义,就是一个事务要等另一个事务提交后才能读取数据。可避免脏读的发生,但
是无法避免不可重复读。

1.2.1 防止脏读

事务_第3张图片
事务_第4张图片

第一个事务为提交时,即使里边做了操作,第二个事务查的还是1000
第一个事务提交后,第二个事务查的950

1.2.2 不可重复读

950:
事务_第5张图片
事务_第6张图片

1.3 Repeatable read (可重复读)

可重复读,就是在开始读取数据时,不再允许修改操作,可避免脏读、不可重复读的发
生。但是无法无法避免幻读。
事务_第7张图片
事务_第8张图片

1.4 Serializable (串行化)

是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可避免脏读、不可重复读、
幻读的发生。就是以锁表的方式(类似于 Java 多线程中的锁)使得其他的线程只能在锁外等
待, 这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

事务_第9张图片

事务_第10张图片
导致第二个事务锁住,只有当第一个事务提交后,第二个事务才能继续执行

1.5

以上四种隔离级别最高的是 Serializable 级别,最低的是 Read uncommitted 级别,当
然级别越高,执行效率就越低。像 Serializable 这样的级别,就是以锁表的方式(类似于
Java 多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据
实际情况。在 MySQL 数据库中默认的隔离级别为 Repeatable read (可重复读)。
在 MySQL 数据库中,支持上面四种隔离级别,默认的为 Repeatable read (可重复
读);而在 Oracle 数据库中,只支持 Serializable (串行化)级别和 Read committed (读已
提交)这两种级别,其中默认的为 Read committed 级别。

你可能感兴趣的:(Java面试)