Spring-事务隔离性

事务隔离性

事务隔离性是指多个事务并发执行的时候互相之间不受彼此的干扰,是事务ACID中的I,根据隔离程度会对隔离性有分类.

数据库并发操作存在的几个问题

在说事务隔离性之前,需要知道的几个名词,如下:

脏读

脏读是指一个事务中访问到了另一个事务未提交的数据.

举个例子,假设现在有两个事务,A和B,他们同时去更新一个数据,比如要更新id=1的这条数据,事务A先查询到这条数据,然后把id更新成2,但是没有提交,这时候事务B在A没有提交的情况下执行搜索,结果搜出来id=2,这就是脏读

不可重复读

不可重复读是指,一个事务内在未提交的前提下,多次搜索一个数据,搜出来的结果不一样. 原因就是在多次搜索期间这个数据被别的事务更新了.

幻读

幻读是指同一个事务内多次查询(查询sql可能不一样), 返回的结果集不一样(比如多了或少了几条数据).

举个例子,事务A内查询数据,第一次查询的时候有100条数据,第二次用相同的条件去查询却查询出来101条数据,同等条件查询两次结果不一样,这就是幻读.

出现幻读的原因其实和不可重复读是一样的,也是另外一个事务新增或删除第一个事务结果集里面的数据.

幻读跟不可重复读的区别就是,幻读是数据变多或者变少了,不可重复读是数据的内容发生了改变.

事务隔离级别

Spring有五大事务隔离级别,接下来详细的看下每个隔离级别

ISOLATION_DEFAULT(默认)

用底层数据库的默认隔离级别,数据库设置的隔离级别是什么就是什么.

其他四个隔离级别,是和数据库的事务隔离级别一样的

ISOLATION_READ_UNCOMMITTED(未提交读)

最低的隔离级别,事务未提交之前,就可以被其他事务读取. 会出现幻读 脏读 不可重复读

ISOLATION_READ_COMMITTED(提交读)

一个事务提交之后才能被其他事务读取到,会造成幻读,不可重复读,是SQL Server数据库的默认隔离级别

ISOLATIONREPEATABLEREAD(可重复读)

保证多次读取一个数据时,其值都和事务开始时候的内容是一致的,禁止读取到别的事务未提交的数据,这个隔离级别可能会造成幻读,是MySql数据库的默认隔离级别

ISOLATION_SERIALIZABLE(序列化)

代价最高的最可靠的隔离级别,能防止脏读,幻读,不可重复读.

总结

隔离级别 脏读 不可重复读 幻读
ISOLATION_READ_UNCOMMITTED(未提交读)
ISOLATION_READ_COMMITTED(提交读)
ISOLATIONREPEATABLEREAD(可重复读)
ISOLATION_SERIALIZABLE(序列化)