我想知道是否有人知道为什么 PostgreSQL、SQL Server、Oracle、Vertica、DB2、Informix和SybaseREAD COMMITTED
的默认事务隔离级别的历史。
MySQL 使用默认的 REPEATABLE READ,至少对于 InnoDB,SQLite和NuoDB 也是如此(他们称之为“一致读取”)。
同样,我不是在问不同隔离级别之间有什么区别,而是要解释为什么READ COMMITTED
在这么多 SQL 数据库中选择默认值。我的猜测是:性能优势小、易于实现、SQL 标准本身的一些建议和/或“它一直都是这样”。这种选择的明显缺点是,READ COMMITTED
对于开发人员来说,这往往是非常违反直觉的,并且可能导致细微的错误。
小智 3
不过,我不记得 BOL 中提到的任何参考文献,因此无法在这里提供它,但根据我的理解,它与锁定有关。较高级别的隔离级别可能会导致锁定问题。READ COMMITTED ISOLATION 更倾向于写锁而不是读,与 OLAP 相比,它更适合 OLTP 环境。商业数据库决定最适合其内部算法的默认隔离级别。选择隔离级别取决于RDBMS如何如何处理锁定并关心读取正确的数据。大多数 RDBMS 更喜欢 READ COMMITTED 以获得更快的读取速度、性能并最大限度地减少锁定。
较低的隔离级别会增加并发性并减少等待其他事务的时间,但会增加读取错误数据的机会。然而,较高的隔离级别会降低并发性并增加等待其他事务的时间,但会降低读取错误数据的机会。
根据维基百科
不同 DBMS 的默认隔离级别差异很大。大多数具有事务功能的数据库都允许用户设置任何隔离级别。某些 DBMS 在执行 SELECT 语句来获取锁时还需要额外的语法(例如 SELECT ... FOR UPDATE 来获取所访问行上的独占写锁)。
然而,上述定义被批评 [3] 含糊不清,并且不能准确反映许多数据库提供的隔离:
本文展示了定义隔离级别的异常方法的许多弱点。这三种 ANSI 现象是不明确的。即使他们最广泛的解释也不排除异常行为。这会导致一些反直觉的结果。特别是,基于锁的隔离级别与其 ANSI 等效级别具有不同的特征。这是令人不安的,因为商业数据库系统通常使用锁定。此外,ANSI 现象不区分商业系统中流行的几种隔离级别。
您可以在此处阅读完整的概要。
归档时间: |
|
查看次数: |
1514 次 |
最近记录: |