事務(wù)的創(chuàng)建與使用

事務(wù)的概念及要求
  • 事務(wù)(transaction)是作為單個邏輯工作單元執(zhí)行的一系列操作。
  • 多個操作作為一個整體向系統(tǒng)提交,要么都執(zhí)行,要么都不執(zhí)行。
  • 事務(wù)是一個不可再分割的工作邏輯單元。
銀行轉(zhuǎn)賬過程就是一個事務(wù)
  • 它需要兩條update語句來完成,這兩條語句是一個整體。
  • 如果其中任一條出現(xiàn)錯誤,則整個轉(zhuǎn)賬業(yè)務(wù)也取消,兩個賬戶中的余額應(yīng)恢復(fù)到原來的數(shù)據(jù),從而確保轉(zhuǎn)賬前和轉(zhuǎn)賬后的余額不變。
事務(wù)的特性
  • 原子性:事務(wù)是一個完整的操作,事務(wù)的各步操作是不可分割的,要么都執(zhí)行,要么都不執(zhí)行。
  • 一致性:當(dāng)事務(wù)完成時,數(shù)據(jù)必須處于一致狀態(tài)。
  • 隔離性:并發(fā)事務(wù)之間彼此隔離、獨立,它不應(yīng)該以任何方式依賴于或影響其他事務(wù)。
  • 永久性:事務(wù)完成后,它對數(shù)據(jù)的修改被永久保存。
事務(wù)的分類
  • 顯式事務(wù):用BEGIN TRANSACTION明確指定事務(wù)的開始,最常用的事務(wù)類型。
  • 隱性事務(wù):通過設(shè)置SET IMPLICIT_TRANSACTION ON語句,將隱性事務(wù)模式設(shè)置為打開,其后的T-SQL語句自動啟動一個新事務(wù)。提交或回滾一個事務(wù)后,下一個T-SQL語句又將啟動一個新事務(wù)。
  • 自動提交事務(wù):SQLServer的默認(rèn)模式;每條單獨的T-SQL語句視為一個事務(wù)。
使用SQL語句管理事務(wù)的基本步驟
--開始事務(wù)
BEGIN TRANSACTION
--提交事務(wù)
COMMIT TRANSACTION
--回滾(撤銷)事務(wù)
ROLLBACK TRANSACTION

事務(wù)處理的關(guān)鍵問題:對事務(wù)中的insert、update、delete語句實時跟蹤

判斷某條語句執(zhí)行是否出錯的方法
  • 使用全局變量@@ERROR
  • @@ERROR只判斷當(dāng)前一條T-SQL語句執(zhí)行是否有錯
  • 為了判斷事務(wù)中所有的T-SQL語句是否有錯,可以對錯誤進行累計
use StudentManageDB
go
declare @errorSum int--定義變量,用于累計事務(wù)執(zhí)行中的錯誤
set @errorSum=0 --初始化為,代表沒有錯誤
begin transaction
    begin
        --轉(zhuǎn)出
        update CardAccount set CurrentMoney-1000 where StudentId=100001
        set @errorSum=@errorSum+@@ERROR
        --轉(zhuǎn)入
        update CardAccount set CurrentMoney+1000 where StudentId=100002
        set @errorSum=@errorSum+@@ERROR --累計是否有錯誤
        if(@errorSum>0)
            rollback transaction
        else
            commit transaction
    end
go
事務(wù)的應(yīng)用
--編寫存儲過程,實現(xiàn)學(xué)員一卡通轉(zhuǎn)賬功能,要求用戶輸入轉(zhuǎn)入和轉(zhuǎn)出的金額和賬戶
use StudentManageDB
go
if exists(select * from Sysobjects where name='usp_TransferAccounts')
    drop procedure usp_TransferAccounts
go
create procedure usp_TransferAccounts
@inputAcount int,--轉(zhuǎn)入賬戶
@outputAccount int, --轉(zhuǎn)出賬戶
@transferMoney int --交易金額
as
    declare @errorSum int--定義變量,用于累計事務(wù)執(zhí)行中的錯誤
    set @errorSum=0 --初始化為,代表沒有錯誤
    begin transaction
    begin
        --轉(zhuǎn)出
        update CardAccount set CurrentMoney-@transferMoney where StudentId=@outputAccount
        set @errorSum=@errorSum+@@ERROR
        --轉(zhuǎn)入
        update CardAccount set CurrentMoney+@transferMoney where StudentId=@inputAcount
        set @errorSum=@errorSum+@@ERROR --累計是否有錯誤
        if(@errorSum>0)
            rollback transaction
        else
            commit transaction
    end
go
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • java事務(wù)的處理 轉(zhuǎn) https://www.cnblogs.com/Bonker/p/5417967.html...
    小小的Jobs閱讀 1,640評論 0 1
  • 事務(wù)就是要保證一組數(shù)據(jù)庫操作,要么全部成功,要么全部失敗。在 MySQL 中,事務(wù)支持是在引擎層實現(xiàn)的。MySQL...
    itczl閱讀 1,100評論 0 0
  • 一、事務(wù)概念 事務(wù)是一種機制、是一種操作序列,它包含了一組數(shù)據(jù)庫操作命令,這組命令要么全部執(zhí)行,要么全部不執(zhí)行。因...
    清茶了了_閱讀 441評論 0 1
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 6,270評論 0 4
  • 事務(wù)(Transaction)是數(shù)據(jù)庫區(qū)別于文件系統(tǒng)的重要特性之一。 在文件系統(tǒng)中, 如果正在寫文件, 但是操作系...
    好好學(xué)習(xí)Sun閱讀 1,149評論 0 5

友情鏈接更多精彩內(nèi)容