OceanBase 限制和降级规则
某些类型的结果集对于某些查询是不适用的。如果为运行的查询指定了不可用的结果集类型或并发类型,则 OceanBase Connector/J 将遵循相应的规则来确定最佳可行类型。
实际的结果集类型和并发类型是在运行语句时确定的,如果所需的结果集类型或并发类型不可用,则驱动程序将在语句对象上发出 SQLWarning
。SQLWarning
对象包含该请求类型不可用的原因。检查警告以验证您是否收到了所需的结果集类型。
结果集限制
对结果集的查询具有以下限制。不遵循这些准则将导致 OceanBase Connector/J 选择备用结果集类型或并发类型。
生成可更新的结果集的限制:
查询只能从单个表中选择,并且不能包含任何联接操作。另外,为了执行插入操作,查询必须选择所有不可为空的列以及所有没有默认值的列。
查询不能使用
SELECT *
。查询必须仅选择表列。不能选择派生的列或聚合,例如一组列的
SUM
或MAX
。
生成对回滚敏感的结果集的限制:
查询不能使用
SELECT *
。查询只能从单个表中选择。
可回滚和可更新的结果集不能有 Stream
列。当服务器必须提取 Stream
列时,会将读取大小减为 1,并阻塞 Stream
列之后的所有列,直到读取到 Stream
列为止。结果为无法批量获取列和滚动浏览。
作为 SELECT *
限制的一种解决方法,可以使用表别名,如以下示例所示:
SELECT tab.* FROM TABLE tab ...
可以通过一种简单的方法来确定查询是否可能生成回滚敏感或可更新的结果集:如果可以合法地将 ROWID
列添加到查询列表中,则该查询可能为对回滚敏感或可更新的结果集。
结果集降级规则
如果指定的结果集类型或并发类型不可用,那么 OceanBase Connector/J 将根据以下规则选择备用类型:
如果指定的结果集类型为
TYPE_SCROLL_SENSITIVE
,驱动程序无法满足该请求,则将尝试降级为TYPE_SCROLL_INSENSITIVE
。如果指定或降级的结果集类型为
TYPE_SCROLL_INSENSITIVE
,驱动程序无法满足该请求,则将尝试降级为TYPE_FORWARD_ONLY
。如果指定的并发类型为
CONCUR_UPDATABLE
,驱动程序无法满足该请求,则将尝试降级为CONCUR_READ_ONLY
。
说明
OceanBase Connector/J 对结果集类型和并发类型的任何操作都是相互独立的。
运行查询后,可以通过在结果集对象上调用方法来验证 OceanBase Connector/J 实际使用的结果集类型和并发类型。
int getType() throws SQLException
此方法返回用于查询的结果集类型的
int
值。ResultSet.TYPE_FORWARD_ONLY
、ResultSet.TYPE_SCROLL_SENSITIVE
或ResultSet.TYPE_SCROLL_INSENSITIVE
是可能的值。
int getConcurrency() throws SQLException
此方法返回用于查询的并发类型的
int
值。ResultSet.CONCUR_READ_ONLY
或ResultSet.CONCUR_UPDATABLE
是可能的值。
避免更新冲突
以下是有关 OceanBase Connector/J 可更新结果集的注意事项:
不对可更新结果集强制执行写锁定。
不检查与结果集
DELETE
或UPDATE
操作的冲突。
如果您尝试对另一个提交事务的行执行 DELETE
或 UPDATE
操作,则会发生冲突。
OceanBase Connector/J 使用 ROWID
唯一标识数据库表中的一行。只要驱动程序尝试向数据库发送 UPDATE
或 DELETE
操作时 ROWID
是有效的,该操作就会运行。
驱动程序将不会报告其他已提交事务所做的任何更改。任何冲突都将被忽略,并且您的更改将覆盖以前的更改。
为避免此类冲突,请在运行生成结果集的查询时使用 FOR UPDATE
功能。这将避免冲突,但也将阻止同时访问数据。数据项只能同时保留一个写锁。