序列化隔离级别的实际用途?

时间:2011-04-20 11:08:36

标签: database isolation-level transaction-isolation

在什么情况下我们使用SERIALIZABLE隔离级别?我在网站上看到了一些答案,当你想要将交易完全隔离时,我们通常会这样做。

根据您自己的经验,我想知道的是,当您在项目中使用此项目时,或者您已经看到将其用于其他项目时,以及未满足的具体要求是什么其他隔离级别?

2 个答案:

答案 0 :(得分:7)

当您构建需要多个查询的复杂报告时,

SERIALIZABLE非常有用。

READ COMMITTEDREPEATABLE READ中,查询可以看到在事务开始和运行之间所做的更改。

pg_dumpPostgreSQL转储实用程序,通过发出SET TRANSACTION ISOLATION LEVEL SERIALIZABLE启动它,以保证转储的数据库状态将是实用程序运行时的状态,并且对数据库的后续更改不会干扰转储。

答案 1 :(得分:2)

如果您想要在并发加载中简单地证明正确性,那么

SERIALIZABLE事务非常有用。由于SQL标准(自SQL-92)中可序列化事务隔离级别的定义是任何并发可序列化事务集的行为必须与某些串行(一次一个)执行顺序一致,可以在单独运行时显示正确的事务的事务将作为任何可序列化事务组合的一部分做正确的事情。

此保护需要付出代价 - 必须阻止或回滚事务以便重试以确保可序列化的事务隔离,并且必须跟踪信息以确定何时需要采取此类操作。在某些开发环境中,使用少量事务类型和少量开发人员,使用不太严格的隔离级别并在应用程序代码中明确管理竞争条件通常更具成本效益。一旦你有几十个针对某个架构正在与成千上万的交易类型的表和数以万计的程序员,确定其中的竞争条件存在成本也成为不太严格的隔离级别喧宾夺主,其通常变得更具成本效益的使用串行事务

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