事务的隔离级别


概述:
  幻读和不可重复读都是读取了另一条已经提交的事务的数据,
  所不同的是不可重复读查询的都是同一个数据项,
  而幻读针对的是一批数据整体 (比如数据的个数).

MySQL数据库提供的四种隔离级别:
Read uncommitted(读未提交):
  如果一个事务已经开始写数据,则另外-个事务则不允许同时进行写操作,但允许其他事务读此行数据。
  该隔离级别可以通过“排他写锁"实现。这样就避免了更新丢失,却可能出现脏读。
  也就是说事务 B 读取到了事务 A 未提交的数据。

Read committed (读已提交) :
  读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
  该隔离级别避免了脏读, 但是却可能出现不可重复读。 事务A事先读取了数据,
  事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

Repeatable read (可重复读取) :
  可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务不能访问该数据。
  第一个事务两次读到的的数据是一样的。 这样就发生了在一个事务内两次读到的数据是一样的, 因此称为是可重复读。
  读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
  这样避免了不可重复读取和脏读,但是有时可能出现幻象读。(读取数据的事务)这可以通过“共享读锁”和“排他写锁”实现。

Serializable (序列化) :
  提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。
  如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
  序列化是最高的事务隔离级别。同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读

Serializable (序列化) > Repeatable read (可重复读取) > Read committed (读提交) > Read uncommitted(读未提交)
级别越高,执行效率就越低。

MySQL和Oracle支持和默认的级别:
  在MySQL 数据库中, 支持上面四种隔离级别, 默认的为 Repeatable read(可重复读取);
  而在Oracle 数据库中,只支持 Serializable (序列化)级别和Read committed(读已提交)这两种级别,
  其中默认的为Read committed(读已提交);

在MySQL数据库中查看当前事务的隔离级别:
select @@ tx_isolation;

在MySQL数据库中设置事务的隔离级别:
set [glogal | session] transaction isolation level 隔离级别名称;
第二种方式:
select tx_isolation='隔离级别名称';

注意:
  1.设置数据库的隔离级别一定要在开启事务之前.
  2.隔离级别的设置只对当前连接有效.
  对于MySQL命令窗口而言,一个窗口就相当于一个连接,当前窗口设置的隔离级别只对当前窗口中的事务有效;
  对于JDBC操作数据库来说,一个 Connection对象相当于一个链接, 设置的隔离级别只对该 Connection对象有效

posted @ 2019-07-02 16:28  笑长不爱笑QvQ  阅读(172)  评论(0编辑  收藏  举报