JetBeginTransaction 函式
適用于: Windows |Windows Server
JetBeginTransaction 函式
JetBeginTransaction函式會導致會話進入交易並建立新的儲存點。 在單一會話上可以多次呼叫此函式,以建立額外的儲存點。 這些儲存點可用來選擇性地保留或捨棄資料庫狀態的變更。
JET_ERR JET_API JetBeginTransaction(
__in JET_SESID sesid
);
參數
sesid
要用於這個呼叫的會話。
傳回值
此函式會傳回具有下列其中一個傳回碼 的 JET_ERR 資料類型。 如需可能 ESE 錯誤的詳細資訊,請參閱 可延伸儲存引擎錯誤 和 錯誤處理參數。
傳回碼 |
Description |
---|---|
JET_errSuccess |
作業已成功完成。 |
JET_errClientRequestToStopJetService |
無法完成作業,因為與會話相關聯之實例上的所有活動因 JetStopService呼叫而停止。 |
JET_errInstanceUnavailable |
無法完成作業,因為與會話相關聯的實例發生嚴重錯誤,需要撤銷所有資料的存取權,以保護該資料的完整性。 此錯誤只會由 Windows XP 和更新版本傳回。 |
JET_errNotInitialized |
無法完成作業,因為與會話相關聯的實例尚未初始化。 |
JET_errRestoreInProgress |
無法完成作業,因為與會話相關聯的實例上正在進行還原作業。 |
JET_errSessionSharingViolation |
同一個會話不能同時用於一個以上的執行緒。 此錯誤只會由 Windows XP 和更新版本傳回。 |
JET_errTermInProgress |
無法完成作業,因為與會話相關聯的實例正在關閉。 |
JET_errTransTooDeep |
無法啟動新的交易,因為會話已經是資料庫引擎允許的最大儲存點深度。 |
成功時,提供的會話將會在交易內。 如果會話先前是在交易內部,則會建立新的儲存點。
失敗時,會話的交易狀態會保持不變。 不會變更資料庫狀態。
備註
資料庫引擎會為其交易提供快照集隔離模型。 這表示,當會話第一次進入交易狀態時,會話會在交易開始時看到整個資料庫凍結。 會話不需要讀取鎖定任何資料,因為它一律可以存取該資料的適當版本。 這表示正在更新資料的會話永遠不會封鎖不同的會話讀取該資料。
使用快照集隔離的另一個含意是用於更新的鎖定模型。 資料庫引擎會將指定資料片段的寫入鎖定獎勵給要求它的第一個會話。 當交易已認可或完全中止時,就會釋放此寫入鎖定,讓會話不再位於交易中。 當會話保留寫入鎖定時,要求相同寫入鎖定的任何其他會話在寫入鎖定可用之前都不會封鎖。 相反地,該第二個會話會立即失敗,並JET_errWriteConflict。 若要解決衝突,第二個會話必須完全中止 (或認可) 交易,等待第一個會話認可或中止交易的一小段時間,然後再重新開始一次。
為了支援快照集隔離,資料庫引擎會在記憶體中儲存所有已修改資料的所有版本,自第一次啟動任何會話上最舊的使用中交易以來。 這對您的應用程式有重要的影響。 造成記憶體中建置大量版本的任何行為,都可能導致實例耗盡其版本存放區大小上限 (如需詳細資訊,請參閱系統參數中的JET_paramMaxVerPages以取得詳細資訊) 。 這類行為包括,但不限於單一交易中的非常大型更新,以及非常長時間執行的交易。 因此,正確設定應用程式預期交易式載入的版本存放區大小非常重要。 請務必小心限制在單一交易中執行的更新數目。 此外,在高負載案例下,請務必盡可能縮短交易持續時間。
強烈建議應用程式在呼叫擷取或更新資料的 ESE API 時,一律位於交易的內容中。 如果未這麼做,資料庫引擎就會代表應用程式自動將此類型的每個 ESE API 呼叫包裝在交易中。 在某些情況下,這些非常短的交易成本可能會快速增加。
引擎的預設行為是將會話使用限制為從第一次呼叫 JetBeginTransaction 到 JetCommitTransaction 或 JetRollback 相符呼叫的時間為止。 您可以使用JetSetSessionCoNtext 和 JetResetSessionCoNtext來設定自訂會話內容,藉此變更此行為來移除這項限制。
資料庫引擎也支援交易式架構修改。 例如,可以開始新的交易、建立資料表、加入幾個資料行、建立索引或兩個數據行,然後中止交易。 剛加入的架構專案將會從資料庫中移除。 您也可以在相同的交易中混合架構修改和一般資料庫更新。
規格需求
需求 | 值 |
---|---|
用戶端 |
需要 Windows Vista、Windows XP 或 Windows 2000 Professional。 |
Server |
需要 Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。 |
標頭 |
在 Esent.h 中宣告。 |
程式庫 |
使用 ESENT.lib。 |
Dll |
需要ESENT.dll。 |
另請參閱
JET_ERR
JET_GRBIT
JET_SESID
JetCommitTransaction
JetGetSystemParameter
JetResetSessionCoNtext
JetRollback
JetSetSessionCoNtext
JetStopService
系統參數