OceanBase 限制和降級(jí)規(guī)則

2021-06-30 15:54 更新

某些類型的結(jié)果集對(duì)于某些查詢是不適用的。如果為運(yùn)行的查詢指定了不可用的結(jié)果集類型或并發(fā)類型,則 OceanBase Connector/J 將遵循相應(yīng)的規(guī)則來確定最佳可行類型。

實(shí)際的結(jié)果集類型和并發(fā)類型是在運(yùn)行語句時(shí)確定的,如果所需的結(jié)果集類型或并發(fā)類型不可用,則驅(qū)動(dòng)程序?qū)⒃谡Z句對(duì)象上發(fā)出 SQLWarning。SQLWarning 對(duì)象包含該請(qǐng)求類型不可用的原因。檢查警告以驗(yàn)證您是否收到了所需的結(jié)果集類型。

結(jié)果集限制

對(duì)結(jié)果集的查詢具有以下限制。不遵循這些準(zhǔn)則將導(dǎo)致 OceanBase Connector/J 選擇備用結(jié)果集類型或并發(fā)類型。

生成可更新的結(jié)果集的限制:

  • 查詢只能從單個(gè)表中選擇,并且不能包含任何聯(lián)接操作。另外,為了執(zhí)行插入操作,查詢必須選擇所有不可為空的列以及所有沒有默認(rèn)值的列。

  • 查詢不能使用 SELECT *

    查詢必須僅選擇表列。不能選擇派生的列或聚合,例如一組列的 SUM 或 MAX。

生成對(duì)回滾敏感的結(jié)果集的限制:

  • 查詢不能使用 SELECT *

  • 查詢只能從單個(gè)表中選擇。

可回滾和可更新的結(jié)果集不能有 Stream 列。當(dāng)服務(wù)器必須提取 Stream 列時(shí),會(huì)將讀取大小減為 1,并阻塞 Stream 列之后的所有列,直到讀取到 Stream 列為止。結(jié)果為無法批量獲取列和滾動(dòng)瀏覽。

作為 SELECT * 限制的一種解決方法,可以使用表別名,如以下示例所示:

SELECT tab.* FROM TABLE tab ...

可以通過一種簡(jiǎn)單的方法來確定查詢是否可能生成回滾敏感或可更新的結(jié)果集:如果可以合法地將 ROWID 列添加到查詢列表中,則該查詢可能為對(duì)回滾敏感或可更新的結(jié)果集。

結(jié)果集降級(jí)規(guī)則

如果指定的結(jié)果集類型或并發(fā)類型不可用,那么 OceanBase Connector/J 將根據(jù)以下規(guī)則選擇備用類型:

  • 如果指定的結(jié)果集類型為 TYPE_SCROLL_SENSITIVE,驅(qū)動(dòng)程序無法滿足該請(qǐng)求,則將嘗試降級(jí)為 TYPE_SCROLL_INSENSITIVE

  • 如果指定或降級(jí)的結(jié)果集類型為 TYPE_SCROLL_INSENSITIVE,驅(qū)動(dòng)程序無法滿足該請(qǐng)求,則將嘗試降級(jí)為 TYPE_FORWARD_ONLY。

  • 如果指定的并發(fā)類型為 CONCUR_UPDATABLE,驅(qū)動(dòng)程序無法滿足該請(qǐng)求,則將嘗試降級(jí)為 CONCUR_READ_ONLY。

說明 
OceanBase Connector/J 對(duì)結(jié)果集類型和并發(fā)類型的任何操作都是相互獨(dú)立的。

運(yùn)行查詢后,可以通過在結(jié)果集對(duì)象上調(diào)用方法來驗(yàn)證 OceanBase Connector/J 實(shí)際使用的結(jié)果集類型和并發(fā)類型。

  • int getType() throws SQLException

    此方法返回用于查詢的結(jié)果集類型的 int 值。ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_SENSITIVE 或 ResultSet.TYPE_SCROLL_INSENSITIVE 是可能的值。

  • int getConcurrency() throws SQLException

    此方法返回用于查詢的并發(fā)類型的 int 值。ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE 是可能的值。

避免更新沖突

以下是有關(guān) OceanBase Connector/J 可更新結(jié)果集的注意事項(xiàng):

  • 不對(duì)可更新結(jié)果集強(qiáng)制執(zhí)行寫鎖定。

  • 不檢查與結(jié)果集 DELETE 或 UPDATE 操作的沖突。

如果您嘗試對(duì)另一個(gè)提交事務(wù)的行執(zhí)行 DELETE 或 UPDATE 操作,則會(huì)發(fā)生沖突。

OceanBase Connector/J 使用 ROWID 唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中的一行。只要驅(qū)動(dòng)程序嘗試向數(shù)據(jù)庫(kù)發(fā)送 UPDATE 或 DELETE 操作時(shí) ROWID 是有效的,該操作就會(huì)運(yùn)行。

驅(qū)動(dòng)程序?qū)⒉粫?huì)報(bào)告其他已提交事務(wù)所做的任何更改。任何沖突都將被忽略,并且您的更改將覆蓋以前的更改。

為避免此類沖突,請(qǐng)?jiān)谶\(yùn)行生成結(jié)果集的查詢時(shí)使用 FOR UPDATE 功能。這將避免沖突,但也將阻止同時(shí)訪問數(shù)據(jù)。數(shù)據(jù)項(xiàng)只能同時(shí)保留一個(gè)寫鎖。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)