Database 血清分离水平的实际用途?

Database 血清分离水平的实际用途?,database,isolation-level,transaction-isolation,Database,Isolation Level,Transaction Isolation,在什么情况下我们使用可序列化隔离级别?我在网站上看到了一些答案,上面说,当你们想让交易完全隔离时,我们通常会这样做 根据你自己的经验,我想知道的是,当您在您的项目中使用过它/或者您看到它在其他项目中使用时,其他隔离级别没有满足的具体要求是什么?SERIALIZABLE在您构建需要多个查询的复杂报告时非常有用 在readcommitted或REPEATABLE READ中,查询可以看到事务启动到运行之间所做的更改 pg_dump,PostgreSQLdump实用程序,通过发出SET TRANSAC

在什么情况下我们使用可序列化隔离级别?我在网站上看到了一些答案,上面说,当你们想让交易完全隔离时,我们通常会这样做


根据你自己的经验,我想知道的是,当您在您的项目中使用过它/或者您看到它在其他项目中使用时,其他隔离级别没有满足的具体要求是什么?

SERIALIZABLE
在您构建需要多个查询的复杂报告时非常有用

readcommitted
REPEATABLE READ
中,查询可以看到事务启动到运行之间所做的更改


pg_dump
PostgreSQL
dump实用程序,通过发出
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
启动它的作业,以确保正在转储的数据库的状态是实用程序运行时的状态,并且对数据库的后续更改不会干扰转储。

如果您希望在并发加载中获得简单的正确性证明,可序列化事务非常有用。由于SQL标准(自SQL-92以来)中可序列化事务隔离级别的定义是,任何可序列化事务的并发集的行为必须与某些串行(一次一个)执行顺序一致,因此任何单独运行时可以显示为执行正确操作的事务,作为任何可序列化事务组合的一部分,将做正确的事情

这种保护要付出代价——必须阻止或回滚事务,以便不时重试,以确保可序列化的事务隔离,并且必须跟踪信息以确定何时需要采取此类操作。在一些具有少量事务类型和少量开发人员的开发环境中,使用不太严格的隔离级别并在应用程序代码中显式管理竞争条件通常更具成本效益。一旦有几十名程序员针对一个具有数百个表和数万个事务类型的模式工作,在不太严格的隔离级别上,确定竞争条件存在的位置的成本可能会变得非常高,使用可序列化事务通常会变得更具成本效益

目前,提供可序列化事务的最常用实现方法是严格的两阶段锁定(S2PL),它依赖于在每个事务结束前保持的阻塞锁,以及通过回滚来打破死锁的死锁检测。在写竞争很少的负载中,可以使用乐观并发控制(OCC)。它在事务处理过程中跟踪“读取集”,并在任何其他事务修改读取集时回滚。一些数据库产品将快照隔离称为可序列化的,尽管它实际上没有提供SQL标准所要求的保证。一种称为Serializable Snapshot Isolation(SerializableSI或SSI)的新技术首次在2008年ACM SIGMOD上发表的一篇学术论文中进行了描述,并在PostgreSQL 9.1及更高版本中使用。它使用快照隔离加上对读写依赖模式的跟踪来确定何时必须取消事务。还有一些在生产中不太常见的技术。每种方法都有自己的优缺点,为这样的问题提供了不同的盈亏平衡点