数据库的事务隔离级别

来源:互联网 发布:象棋作弊软件 编辑:程序博客网 时间:2024/05/18 15:54

在数据库操作中,为了有效保证并发读取数据的正确性,我们提出了事务的隔离级别:

大多数数据库系统的默认事务隔离级别为:读已提交。

经常使用到的数据库系统的默认事务隔离级别如下:

SQL server:读已提交

PostgreSQL:读已提交

MySQL:可重复读

Oracle:可重复读(Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读。)


读未提交(又叫脏读,即读取未提交的事务,肯定会出现问题):是指读数据时数据库不要求有共享锁(读锁)。因此,其他事务可以读取随后可能会回滚的未提交的事务,即脏读。未提交的事务都能被其他事务读取到,你说这数据脏不脏?

读已提交(读取已提交的事务,仍然会出现问题):是指数据库中需要有共享锁(读锁)才能读取数据。只能读取已经提交的数据,但在事务结束之前可以修改这些数据,会造成不可重复读的问题。一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交事务修改

可重复读(可以重复读取同一条数据,还是有可能出现问题):是指一个事务中用到的所有数据都有锁,其他事务不能更新这些数据。但是其他事务可以向数据集中插入新项,如果事务再次从这个数据集中读取数据,那么就会出现“虚读”,又可以称为幻读。我们可以简单理解幻读在一个事务的两次查询中,数据的笔数不一致

可串行化(可序列化,不会出现任何问题):是指一个事务中用到的所有数据都有锁,并且其他的事务不能更新这个数据集或向这个数据集中插入数据项


显而易见,如果一个数据库只支持页级锁(不支持行级锁),那么可重复读和可序列化是相同的。这是因为其他事务在前一个事务完成之前不能插入单个数据行,因为整页数据都被锁住了。


补充:

共享锁(S锁):若事务T对数据对象A加上S锁,则事务T只能读A, 不能修改A;其他事务只能再对A加S锁(其他事务只能读取A),而不能加X锁(不能修改A),直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

排他锁(X锁):若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁(其他事务即不能读也不能修改),直到T释放A上的X锁。这就保证了其他事务在T释放A上的X锁之前不能再读取和修改A。


0 0
原创粉丝点击