1.数据库并发操作带来的主要问题及原因:

① 丢失修改

当两个或多个事务读入同一数据并修改,会发生丢失修改问题,前一个事务修改的结果会被后一事务所做的修改覆盖。

② 脏读

当一个事务修改某个数据后,另一事务对该数据进行了读取,由于某种原因前一事务撤销了对该数据的修改,即将修改后的数据恢复原值,相当于没有执行前一事务,那么后一事务读到的就是一个不正确的数据,称为“脏数据”。

③ 不可重复读

一个事务读取某个数据后,另一事务对该数据作了修改,当前一事务再次读取该数据(希望与第一次读取的是相同的值)时,得到的数据与前一次的不一样。

2.四种事务隔离级别的区别以及可能出现的问题:

① Read uncommitted(读未提交)

  如果一个事务已经开始写数据,则另一个事务不允许同时进行写操作,但允许其他事务读此数据。该隔离级别可以通过“排他写锁”实现。
  避免了丢失修改,却可能出现脏读。也就是说事务B读取了事务A未提交的数据(随后事务A回滚)。

② Read committed(读提交)

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

③ Repeatable read(可重复读)

  读取数据的事务将会禁止其他写事务(但允许其他读事务),写事务则禁止任何其他事务。
  避免了脏读和不可重复读,但是有时可能出现幻读。这可以通过“共享读锁”和“排他写锁”实现。

④ Serializable(可串行化)

  提供严格的事务隔离。它要求事务可串行化地并发执行。如果仅仅通过“行级锁”是无法实现事务可串行化的,而通过“表级锁”来实现,即通过对整个表加锁,避免同一事物的两次读之间,表中插入新的记录导致两次读取的记录数不同,称为幻读
  可串行化是最高的事务隔离级别,同时并发度会很低,一般很少使用。在该级别下,任何对数据库的读写都不会产生不一致性,但有时不精确的读取时允许的,但写入必须保证正确,常用的隔离级别是Read commited。

06-04 08:14