数据库的隔离级别
数据库中每个事务都要占用一些资源,比如对表/数据共享操作权限,事务的隔离级别描述了事务对资源共享程度。
数据库的事务的隔离级别和解决的问题
隔离级别 | 出现的问题 | 原因 |
---|---|---|
READ-UNCOMMITED | 脏读 | 其他事务(线程)可以读取到当前事务修改但未提交的数据 |
READ-COMMITTED | 不可重复读 | 设置数据库的隔离级别为READ-COMMITTED后可以解决事务脏读;当前事务获取数据的读锁,读完之后就解锁,当前事务有没有结束(即当前事务未提交),这时,其他事务可以对这个数据进行修改(读写),而当前事务再次读取这个数据时,数据在当前事务读取的两次过程中显示不一致,产生了事务中不可重复读现象 |
Repeatable Read(可重读) | 幻读 | 不可重复读通过设置数据库的Repeatable Read隔离级别(即对当前事务的操作的数据加锁,并且只有等等事务结束才释放锁,这样避免了不可重复读);这仅仅保证了一个事务对的数据操作的过程中不被其他事务修改,不能阻止其他事务提交新的数据(向表中插入新数据或删除部分数据),尤其是当前事务统计表中数据时,两次统计的结果不一致导致幻读(像幻觉一般) |
Serializable(可串行化) | 数据库设置的隔离级别为Serializable时,事务读取数据可获得范围锁(如表锁等),事务之间访问这段数据时,必须一个接着一个串行进行访问 |
由此可知:隔离级别越高,受其他事务干扰就越少,并发性能就越差。
想法
数据库事务的对数据的访问其实质就多线程对共享数据的访问,隔离级别就是对数据加锁的应用(加锁的粒度问题)。