View a markdown version of this page

Neptune 中的 Gremlin 交易 - Amazon Neptune

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Neptune 中的 Gremlin 交易

有數個內容,Gremlin 交易會在其中執行。使用 Gremlin 時,務必了解您正在其中運作的內容以及其含義:

  • Script-based – 請求是使用文字型 Gremlin 字串提出的,如下所示:

    • 使用 Java 驅動程式和 Client.submit(string)

    • 使用 Gremlin 主控台和 :remote connect

    • 使用 HTTP API。

  • Bytecode-based – 請求是使用 Girmlin 語言變體 (GLV) 典型的序列化 Gremlin 位元碼提出的。

    例如,使用 Java 驅動程式 (g = traversal().withRemote(...))。

對於上述任一內容,有額外的請求內容,被當作無工作階段形式或繫結至工作階段的方式傳送。

注意

必須始終遞交或復原 Gremlin 交易,才能釋出伺服器端資源。如果在交易期間發生錯誤,請務必重試整個交易,而不只是失敗的特定請求。

無工作階段請求

無工作階段時,請求等同於單一交易。

對於指令碼,其含義是單一請求中傳送的一個或多個 Gremlin 陳述式將做為單一交易進行遞交或復原。例如:

Cluster cluster = Cluster.open(); Client client = cluster.connect(); // sessionless // 3 vertex additions in one request/transaction: client.submit("g.addV();g.addV();g.addV()").all().get();

對於位元碼,針對從 g 產生和執行的每個周遊提出無工作階段請求:

GraphTraversalSource g = traversal().withRemote(...); // 3 vertex additions in three individual requests/transactions: g.addV().iterate(); g.addV().iterate(); g.addV().iterate(); // 3 vertex additions in one single request/transaction: g.addV().addV().addV().iterate();

繫結至工作階段的請求

當繫結至工作階段時,可在單一交易的內容中套用多個請求。

對於指令碼,含義是不需要將所有圖形操作串連成單一內嵌字串值:

Cluster cluster = Cluster.open(); Client client = cluster.connect(sessionName); // session try { // 3 vertex additions in one request/transaction: client.submit("g.addV();g.addV();g.addV()").all().get(); } finally { client.close(); } try { // 3 vertex additions in three requests, but one transaction: client.submit("g.addV()").all().get(); // starts a new transaction with the same sessionName client.submit("g.addV()").all().get(); client.submit("g.addV()").all().get(); } finally { client.close(); }

對於以指令碼為基礎的工作階段,使用 關閉用戶端會client.close()遞交交易。指令碼型工作階段中沒有可用的明確轉返命令。若要強制轉返,您可以在關閉用戶端g.inject(0).fail('rollback')之前發出查詢,例如 ,導致交易失敗。

注意

類似 g.inject(0).fail('rollback')的查詢,用於刻意擲回錯誤以強制轉返, 會在用戶端上產生例外狀況。關閉用戶端之前,請先擷取並捨棄產生的例外狀況。

對於位元組碼,可以明確控制交易,並以透明的方式管理工作階段。Gremlin 語言變體 (GLV) 支援 commit()rollback() 交易的 Gremlin tx() 語法,如下所示:

GraphTraversalSource g = traversal().withRemote(conn); Transaction tx = g.tx(); // Spawn a GraphTraversalSource from the Transaction. // Traversals spawned from gtx are executed within a single transaction. GraphTraversalSource gtx = tx.begin(); try { gtx.addV('person').iterate(); gtx.addV('software').iterate(); tx.commit(); } finally { if (tx.isOpen()) { tx.rollback(); } }

雖然上述範例是以 Java tx() 撰寫,但您也可以將此語法用於其他語言。如需特定語言的交易語法,請參閱適用於 JavaPythonJavascript、.NETGo 的 Apache TinkerPop 文件的交易一節。

警告

無工作階段唯讀查詢是在 SNAPSHOT 隔離下執行,但是在明確交易內執行的唯讀查詢是在 SERIALIZABLE 隔離下執行。在 SERIALIZABLE 隔離下執行的唯讀查詢會產生更高的負荷,並且可能會封鎖並行寫入或遭其封鎖,這與在 SNAPSHOT 隔離下執行的唯讀查詢不同。

位元組碼遞交和轉返的逾時行為

當您搭配 tx() 語法使用以位元組碼為基礎的交易時, commit()rollback()操作不會受到查詢逾時設定的約束。透過 設定的全域neptune_query_timeout參數和每個查詢逾時值evaluationTimeout都不適用於這些操作。在 伺服器上, commit() 在沒有時間限制的情況下rollback()執行,直到完成或發生錯誤為止。

在用戶端,在伺服器回應之前,Gremlin 驅動程式的 tx.commit()tx.rollback()呼叫不會完成。根據語言,這可能顯示為封鎖呼叫或未解決的非同步操作。沒有驅動程式提供將這些呼叫綁定的內建逾時設定。如需這些交易功能的並行行為詳細資訊,請參閱特定 Gremlin 語言變體的 API 文件。

重要

如果 commit()rollback()呼叫花費的時間超過預期,則可能會因為並行交易的鎖定爭用而遭到封鎖。如需鎖定衝突的詳細資訊,請參閱 使用鎖定等待逾時的衝突解決機制

如果您需要限制應用程式等待 commit()或 的時間rollback(),您可以使用語言的並行功能來套用用戶端逾時。如果用戶端逾時觸發,伺服器會繼續處理操作。伺服器端操作會保留工作者執行緒,直到完成為止。在用戶端逾時之後,請關閉連線並建立新的連線,而不是重複使用現有的連線,因為交易狀態不確定。

伺服器端交易清除

如果用戶端在未遞交或復原的情況下中斷或放棄交易,Neptune 具有最終清除孤立交易的伺服器端機制:

  • 工作階段逾時   –   閒置超過工作階段存留期上限 (10 分鐘) 的位元組型工作階段會關閉,且任何開啟的交易都會復原。

  • 連線閒置逾時   –   Neptune 會關閉閒置約 20 分鐘的 WebSocket 連線。當連線關閉時,伺服器會復原與該連線相關聯的任何開啟交易。

這些清除機制是安全網路。我們建議您在完成交易時,一律明確遞交或轉返交易。