事务隔离性
事务隔离性是指多个事务并发执行的时候互相之间不受彼此的干扰,是事务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(序列化) |