由于隔离级别可序列化而导致 SQL 事务失败的一般处理
Generalized handling of SQL transaction failures due to isolation level serializable
PostgreSQL documentation 13.2.3. Serializable Isolation Level 状态:
It is important that an environment which uses this technique have a generalized way of handling serialization failures (which always return with a SQLSTATE value of '40001'), because it will be very hard to predict exactly which transactions might contribute to the read/write dependencies and need to be rolled back to prevent serialization anomalies.
这是否总是立即重试交易直到成功一样简单?伪代码:
while (true) {
try {
BEGIN TRANSACTION
...
COMMIT TRANSACTION
}
catch (SQLSTATE == '40001') {
continue; // retry
}
break; // succeed
}
是否保证在某个时候成功?是否存在这种情况,在失败一次后就不可能成功?人们还能/应该做什么?这取决于场景吗?也许有时也必须重复较早的查询交易?在那种情况下,怎么可能有一个通用的解决方案?
是否有此类通用处理机制的开源示例?或者描述不同方法的任何好的资源(书籍、文章等)?
您的代码示例准确地显示了应该如何完成。
序列化失败应该很少发生;如果他们不这样做,则说明您的数据库或应用程序设计中的某些内容不合理。
我想可以构建一个交易永远不会成功的场景,但这在实践中没有问题。
PostgreSQL documentation 13.2.3. Serializable Isolation Level 状态:
It is important that an environment which uses this technique have a generalized way of handling serialization failures (which always return with a SQLSTATE value of '40001'), because it will be very hard to predict exactly which transactions might contribute to the read/write dependencies and need to be rolled back to prevent serialization anomalies.
这是否总是立即重试交易直到成功一样简单?伪代码:
while (true) {
try {
BEGIN TRANSACTION
...
COMMIT TRANSACTION
}
catch (SQLSTATE == '40001') {
continue; // retry
}
break; // succeed
}
是否保证在某个时候成功?是否存在这种情况,在失败一次后就不可能成功?人们还能/应该做什么?这取决于场景吗?也许有时也必须重复较早的查询交易?在那种情况下,怎么可能有一个通用的解决方案?
是否有此类通用处理机制的开源示例?或者描述不同方法的任何好的资源(书籍、文章等)?
您的代码示例准确地显示了应该如何完成。
序列化失败应该很少发生;如果他们不这样做,则说明您的数据库或应用程序设计中的某些内容不合理。
我想可以构建一个交易永远不会成功的场景,但这在实践中没有问题。