数据库事务的四级隔离级别
数据库事务的四级隔离级别
提出数据库的食物隔离级别是为了保证数据库读取中的正确性。
首先说明一下数据库操作中由于事务引起的不可预料事件。
1.A事务和B事务同时更新表中的某一行数据,但是事务B由于出现故障推出,导致A和B对数据的修改都失效。
2.A事务修改了数据但是没有提交,此时B事务来读取相对应的数据时会读取到A修改之前的数据。
3.A事务读取某行数据后,B事务修改了A读取的那行数据,A再次读取那行时得到值和之前不一样。
4.A事务进行了两次数据查询操作,第二次查询得到了第一次查询中没有出现或者丢失了的数据。
其中第1类问题称为更新丢失问题,第2类问题成为脏读问题,第3和4类问题统称为不可重复读问题,第4类问题又成为幻读。
针对上诉四种问题,SQL规范中提出了四种事务隔离级别来处理上诉问题。
1.未授权读(Read uncommitted):允许脏读,但不允许更新丢失。如果A事务开始写数据,那么B事务不允许同时进行写操作,但是允许B事务的读操作。此种事务隔离级别可以通过“排他锁”来实现。
2.授权读(Read committed):允许不可重复读,但是不允许脏读。可以通过“瞬间共享读锁”和“排他锁”来实现。读取数据的事务允许其他事务继续读取该行数据,但是未提交的写事务拒绝其他事务访问该行事务。
3.可重复读(Repeatable read ):禁止不可重复读和脏读,但有时会出现幻读。可以通过“共享读锁”和“排他写锁”来实现。读取数据的事务会禁止其他写事务,但是允许读事务;写数据的事务禁止一切其他事务。
4.序列化(Serializable):最高的事务隔离级别,它要求事务必须序列化的串行执行,不允许事务并行执行。
事务的隔离的级别越高越能保证数据的一致性和完整性,但是引起的问题是应用的并发性降低,响应速度降低。