多个事务同时使用相同的数据时可能会发生问题
并发问题:
第一类丢失更新
当多个事务同时操作同一数据,撤销其中一个事务时,把其他事务已提交的更新数据覆盖,对其他事务来说造成了丢失第二类丢失更新
当多个事务同时操作同一数据,事务A将修改结果成功提交后,对事务B已经提交的修改进行了覆盖,对事物B来说造成了数据丢失脏读
当多个事务同时操作同一数据时,事务A读到事务B未提交的更新数据,且对数据进行操作,如果事务B撤销更新后,事务A所操作的数据便成了脏数据不可重复读
当多个事务同时操作同一个数据时,事务A对同一行数据重复读取两次,每次读取的结果不同,有可能第二次读取数据的时候原始数据被事务B更改,并成功提交幻象读
当多个事务同时操作同一数据时,事务A执行两次查询,第二次查询结果比第一次查询多出一行,这是因为在两次查询之间事务B插入了新的数据造成的
为避免并发问题的发生,在标准SQL规范中,提出4个事务隔离级别,如下:
- 序列化(8级)
提供最严格的事务隔离,该隔离级别不允许事务并发执行,只允许一个接着一个执行,不能并发执行,此隔离级别可以有效防止脏读、不可重复读和幻想读 - 可重复读取(4级)
一个事务在执行过程中可以访问其他事务成功提交的新插入数据,但不能访问成功修改的数据,读取数据的事务将会禁止写事务,但允许读事务,写事务则禁止其他事务,此隔离级别可以有效防止不可重复读和脏读两类并发问题 - 读已提交数据(2级)
一个事务在执行过程中既可以访问其他事务成功提交的新插入的数据,又可以访问成功修改的数据,读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该数据,此隔离级别可有效防止脏读 - 读未提交数据(1级)
一个事务在执行过程中既可以访问其他事务未提交的新插入的数据,又可以访问未提交的修改的修改的数据,如果一个事务已经开始写数据,则不允许另外一个事务同时进行写操作,但允许其他事务进行读操作,此隔离级别仅防止第一类丢失更新