兩種主要的事務ID類型:全局ID和本地ID。事務管理器分配全局ID,當一個事務需要多個事務資源參與時候需要全局ID。如果資源管理器也分配事務ID,那么它們是與此全局事務ID相關聯的本地ID,因為它們指向同一個事務。
鏈式事務,應用程序執行的事務序列形成一個鏈,一個事務接一個事務的執行,中間沒有間隔。非鏈式模型,程序完成一個事務后,不需要立即開始執行一個事務,例如可以使用start開始一個事務,commit/rollback提交或者回滾一個事務方式,顯示定義每個事務的開始和結束。
事務屬性:
requires new:每個方法調用都在新的事務中開始執行,不管調用者是否在已經在事務中執行,
required:如果調用已經在事務中運行,則被調用的方法也在此事務中執行,如果調用者未在事務中運行,那么被調用方法開始在新事務中執行。
supported:如果調用者已經在事務中運行,則被調用方法在此事務中執行,如果調用者被在事務中運行,那么被調用方法不在事務中執行。
noe supported:被調用方法不在事務中執行,即使創建此對象的程序正在事務中運行。
影響TP系統體系的因素:
組件是否共享地址空間。
此地址空間是否有多個線程中的一個線程在執行。
是否有硬件、操作系統或者語言機制保護一個地址空間的程序,避免不適當的修改彼此的內存。
實現線程:
中間件線程,操作系統并不知道線程,而是當做一個普通的進程。這里有一個技術難題,就多線程中執行的事務服務器試圖從磁盤讀取數據或者試圖讀取通信消息,并且它需要的數據還不可用,那么操作系統一般會使進程處于睡眠。如果只有一個線程,那么正如鎖希望的--使進程處于睡眠狀態,直到它有事做。如果在進程中的多線程運行,則所有的線程,進而所有的客戶端都會有延遲,這不是好事情,并且這里會存在2級調度,操作系統調度進程,事務中間件正在調度線程,可能存在調度中存在的問題而導致事務失敗或者其他問題。
操作系統線程,如果操作系統支持多線程,那么操作系統會跟蹤所有的線程,當線程發起IO操作,操作系統使線程處于睡眠狀態,操作系統能夠識別什么時候可以調用線程,并調用做好執行準備的另一個線程,而不是使整個進程處于睡眠狀態,這樣減少了上下文切換。如果是SMP多處理器或者多喝處理器運行,則它可以使用并發,不同的線程分配到不同的core上運行。當然,這也有性能的開銷,操作系統設計線程切換和系統調用,一般比進程切換開銷小,但是比用戶態的線程操作更昂貴。第二個問題,就是,內存保護問題,多線程運行在相同的進程空間中,線程之間只有很少或者沒有內存保護,線程執行的錯誤會潛在的危害整個進程的內存。
服務器類,當多線程操作系統進程不可用時,可以選擇一組進程模仿一組線程,每個進程有自己的內存空間,互相獨立,有很強的內存保護的效果。由于進程是單線程的,即使同步IO操作期間發生阻塞,是進程處于睡眠狀態,沒有什么關系。由于服務器類中進程的失敗是彼此獨立的,因為其他進程繼續運行,如果在多線程進程中,一個線程的故障會影響整個進程,尤其是此線程破壞了其他線程的內存。但是單進程單線程方式,存在2個問題,第一個問題是如果進程開的太多,上下午切換頻繁,工作的狀態并不理想。第二個問題,就是負載均衡,如何保持一些進程很繁忙,一些進程很閑。