是否可以仅使用 Insert 和 Select 语句在 Redshift 中引发可序列化隔离冲突?
Is it possible to raise a Serializable Isolation Violation in Redshift using only Insert and Select statements?
只是一些背景知识:我们的软件执行简单但速度相当快(高峰时每秒 +/- 1,有时并发),INSERT
和 SELECT
语句针对特别是 Redshift table。有时,这些语句之一,通常是 INSERT
语句(也许总是?),会抛出一个可序列化隔离冲突。没有连接或任何复杂的东西,只是插入一条记录,并根据过滤器选择记录组。
我的问题:如何仅使用 Insert 和 Select 语句在 Redshift 中引发可序列化隔离冲突?
根据我对可序列化隔离的工作原理的理解,只有像 UPDATE
和 DELETE
语句这样的东西才能破坏可序列化性。我一遍又一遍地阅读 documentation,但它没有提供任何有用的示例来真正理解手头的原则。我想也许我对 SI 的理解不正确。有人可以解释一下(希望有一个例子)这个原则是如何工作的吗?
这个问题的替代标题也可以是:"Explain Like I'm 5: Serialization Isolation," 因为我很可能完全问错了问题。
这个怎么样:
T1: INSERT A
T2: INSERT B
T2: SELECT somethingThatWouldIncludeAIfItWasCommitted
=> but it was not committed, so it will not be included
=> T1 must be after T2
T1: SELECT somethingThatWouldIncludeBIfItWasCommitted
=> T2 must be after T1 => BOOM
只是一些背景知识:我们的软件执行简单但速度相当快(高峰时每秒 +/- 1,有时并发),INSERT
和 SELECT
语句针对特别是 Redshift table。有时,这些语句之一,通常是 INSERT
语句(也许总是?),会抛出一个可序列化隔离冲突。没有连接或任何复杂的东西,只是插入一条记录,并根据过滤器选择记录组。
我的问题:如何仅使用 Insert 和 Select 语句在 Redshift 中引发可序列化隔离冲突?
根据我对可序列化隔离的工作原理的理解,只有像 UPDATE
和 DELETE
语句这样的东西才能破坏可序列化性。我一遍又一遍地阅读 documentation,但它没有提供任何有用的示例来真正理解手头的原则。我想也许我对 SI 的理解不正确。有人可以解释一下(希望有一个例子)这个原则是如何工作的吗?
这个问题的替代标题也可以是:"Explain Like I'm 5: Serialization Isolation," 因为我很可能完全问错了问题。
这个怎么样:
T1: INSERT A
T2: INSERT B
T2: SELECT somethingThatWouldIncludeAIfItWasCommitted
=> but it was not committed, so it will not be included
=> T1 must be after T2
T1: SELECT somethingThatWouldIncludeBIfItWasCommitted
=> T2 must be after T1 => BOOM