> 文章列表 > 事务相关概念

事务相关概念

事务相关概念

事务

  • 事务属性:隔离级别
    • 1、数据库访问中三个读的问题
    • 2、隔离级别介绍
    • 3、使用方式

事务属性:隔离级别

事务:逻辑上的一组操作,这些操作要么都成功,有一个失败所有都失败

1、数据库访问中三个读的问题

1、脏读:在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。

2、不可重复读:指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果

3、虚读(也称幻读):幻读,即一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.

2、隔离级别介绍

数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。一个事务与其他事务隔离的程度称为隔离级别。SQL标准中规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

隔离级别一共有四种:

  • 读未提交:READ UNCOMMITTED (read uncomitted)

    允许Transaction01读取Transaction02未提交的修改。

  • 读已提交:READ COMMITTED(read committed)

    要求Transaction01只能读取Transaction02已提交的修改。

  • 可重复读:REPEATABLE READ (repeatable read)

    确保Transaction01可以多次从一个字段中读取到相同的值,即Transaction01执行期间禁止其它事务对这个字段进行更新。

  • 串行化:SERIALIZABLE(serializable)

    确保Transaction01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。

各个隔离级别解决并发问题的能力见下表:

隔离级别 脏读 不可重复读 幻读
READ UNCOMMITTED (read uncomitted)读未提交
READ COMMITTED (read comitted) 读已提交
REPEATABLE READ (repeatable read) 可重复读
SERIALIZABLE (serializable) 串行化

各种数据库产品对事务隔离级别的支持程度:

隔离级别 Oracle MySQL
READ UNCOMMITTED(read uncommited) ×
READ COMMITTED(read committed) √(默认)
REPEATABLE READ(repeatable read) × √(默认)
SERIALIZABLE(serializable)

3、使用方式

@Transactional(isolation = Isolation.DEFAULT)//使用数据库默认的隔离级别
@Transactional(isolation = Isolation.READ_UNCOMMITTED)//读未提交
@Transactional(isolation = Isolation.READ_COMMITTED)//读已提交
@Transactional(isolation = Isolation.REPEATABLE_READ)//可重复读
@Transactional(isolation = Isolation.SERIALIZABLE)//串行化