事務的實現

2021-07-15 20:10:53 字數 1579 閱讀 9131

在很早的以前,我們要實現乙個事務通常是基於sql的資料庫事務,一般的通過sql查詢語言來實現,如下所示,同時更新兩本書的**:

begin transaction  

update

tb_book

set

price

=122 where

ident_current

=1001

update

tb_book

set

price

=88 where

ident_current

=1002

if @@error

<> 0

begin

rollback transaction

end

else

commit transaction

隨著.net技術的不斷發展,可通過ado.net來實現,這樣我們可以將事務更好的應用在業務邏輯中,而非資料庫儲存中,這樣能夠更好的實現業務和儲存分離,使的事務被業務邏輯所控制,資料庫專注於資料儲存,達到各負其責的作用,在ado.net中事務的寫法是:

using (dbtransaction transaction = connection.begintransaction())

catch (exception e)

}

上面的**只能基於同乙個資料庫連線進行,後來為了實現遠端多個資料庫的事務,提出了分布式事務,誇資料庫伺服器進行事務關聯:

using (transactionscope transactionscope = new 

transactionscope())

//運算元據庫伺服器2中的資料庫

using (sqlconnection connection = new

sqlconnection(connectionstring2))

transactionscope.complete();

}

有時候,我們需要將ntfs檔案系統的操作進行事務管理,例如:首先將儲存到硬碟,然後將檔案路徑存入資料庫,這兩個步驟是滿足事務(acid)原則的,資料庫應該與檔案系統保持同步,要麼都刪除,要麼都存在,同生共死。但可惜微軟沒有在.net中提供這樣的api介面供開發人員使用,零度博主抱著對技術精益求精的態度進行了一番的折騰,終於在國外的乙個社群找到了針對作業系統核心(kernel32.dll)封裝的ktm事務管理方案,零度博主針對自己的需求進行了改進,本方案的c#.net呼叫方式如下:

using (transactionscope transactionscope = new 

transactionscope())

以上示例**首先建立transactionscope事務環境,將檔案操作和資料庫操作關聯成成同乙個事務,transactedfile正是上文提到的基於ktm的本地事務封裝,資料庫事務本身支援隱式自動關聯,當前者和後者同時被關聯到transactionscope事務上下文環境後,就形成了乙個完成的事務。上面的示例首先向磁碟的log.txt中寫入當前的時間和要執行的sql語句,然後通過sql更新book**,如果更新**失敗則回滾寫入的日誌(自動刪除日誌)。

SQLite事務的實現

使用sqlitedatabase的begintransaction 方法可以開啟乙個事務,程式執行到endtransaction 方法時會檢查事務的標誌是否為成功,如果程式執行到endtransaction 之前呼叫了settransactionsuccessful 方法設定事務的標誌為成功則提交事...

事務ACID的實現

事務需要滿足acid特性,那在資料庫中,它是如何實現的?我們接下來的內容將一一介紹。其實我們在 mysql innodb引擎 mvcc併發控制 中談到了事務的隔離級別,但沒有談到怎樣實現隔離性。我們提到了要消除幻讀,一般的資料庫系統需要保證序列化的事務隔離級別,而mysql innodb在可重複讀的...

TeaFramework 事務的實現

事務的本質 讓程式像我們看到的那樣執行。資料庫事務就是對於界定為同乙個事務的一組資料庫操作,要麼同時成功,要麼同時失敗,不可能出現部分成功的中間狀態。對於jdbc原生事務,首先要設定自動提交為false connection.setautocommit false 如果整個執行過程沒有異常則提交事務...