不隔离问题
- 更新丢失
- 更新丢失:两个事务同时更新,第二个事务回滚会覆盖第一个事务更新的数据,导致更新丢失
- 两次更新
- 脏读:一个事务处理过程里读取了另一个未提交的事务中的数据。
- 不可重复读:对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
- 幻读:非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读
幻读和不可重复读的异同:都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
事务隔离级别
读未提交
含义解释:只限制同一数据写事务。解决更新丢失。
名词解释:可读取未提交数据
所需要锁:排他写锁
出现问题:脏读、不可重复读和幻读问题。
读提交
含义解释:只限制同一数据写事务,解决脏读,以及更新丢失
名词解释:必须提交之后才可以读取
出现问题:不可重复读和幻读
可重复读
含义解释:限制同一数据写事务禁止其他读写事务,读事务禁止其它写事务(允许读)。解决”不可重复读”,以及”更新丢失”和”脏读”。(一事务写时禁止其他事务读写、一事务读时禁止其他事务写)
名词解释:能够重复读
所需的锁:排他写锁、共享读锁
出现问题:幻读
串行化
含义解释:限制所有读写事务都必须串行化实行。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。(一事务写时禁止其他事务读写、一事务读时禁止其他事务读写)
所须的锁:范围锁或表锁
数据库的数据隔离级别
数据库 | 默认级别 |
MySQL | 可重复读(Repeatable Read) |
Oracle | 读提交(Read Committed) |
SQLServer | 读提交(Read Committed) |
DB2 | 读提交(Read Committed) |
PostgreSQL | 读提交(Read Committed) |