事務鍊和自動送出之間的關係
我試圖了解事務連結和自動送出概念之間的關係。自動送出通常在客戶端程式介面中公開。例如在 JDBC 中使用Connection#setAutoCommit方法。
即我想知道是否:
- 這些概念只是彼此的別名(以及對應關係是什麼)
要麼
- 這些概念是正交的,所有 4 種組合都有意義並產生不同的結果(以及這些結果是什麼)
有許多資源表明案例是 1。相同的資源似乎表明
unchained
對應於autocommit on
. 例如 這篇文章說:設置鍊式關閉(Sybase 中的預設設置,= 設置自動送出)
這個更廣泛的文章同樣說:
一些數據庫程式介面具有自動送出模式,也稱為非鏈模式。在這種模式下,每條語句都是一個事務,執行後送出。如果您希望在應用程序中使用事務,則需要使用手動送出模式或鍊式模式。
到目前為止,這是我自己的理解。例如,每當我嘗試執行(使用 JDBC)儲存過程時,都會遇到以下消息:
java.sql.SQLException:儲存過程 ‘whatever’ 只能在非鍊式事務模式下執行。
…然後在我的程式碼中設置:
conn.setAutoCommit(true);
…修復了似乎確認確實unchained與**autocommit相同的問題。
但是查看Sybase ASE 文件,其中一個內容如下:
預設模式稱為非鏈模式或 Transact-SQL 模式,需要顯式開始事務語句與送出事務或回滾事務語句配對才能完成事務。
這似乎與自動送出完全相反——除非上述文本被理解為具有以下含義:
預設模式,稱為非鏈模式或 Transact-SQL 模式,需要顯式開始事務語句與送出事務或回滾事務語句配對,以在一個事務中放置多個語句時完成事務。
最後,我看到這篇文章表明連結和自動送出大多是正交的。
AutoCommit true 與 chained off 相同
AutoCommit false 與 chained on 相同
在鍊式模式下,您的第一條語句將啟動一個隱式事務,該事務將保持活動狀態,直到您手動送出或回滾。
儘管手冊說預設模式是未連結的,但客戶端庫並非如此。除非您覆蓋它,否則 JDBC 和 Python 驅動程序使用預設模式鍊式。