小鄧與你一起快速了解 事務

2021-10-06 13:28:23 字數 2585 閱讀 6789

1.什麼是事務

事務就是被繫結在一起作為乙個邏輯工作單元的sql語

句,如果任何乙個語句操作失敗那麼整個操作就被失敗,

進而回滾到操作前狀態,或者是上個節點。為了確保要麼

執行,要麼不執行,就可以使用事務。要將一組語句作為

事務考慮,就需要通過acid測試,即原子性,一致性,隔

離性和永續性。

2.事務的四大特性

a. 原子性:

事務是乙個不可分割的整體,為了保證事務的總體目標,

事務必須具有原子性,即當資料修改時,要麼全執行,要

麼全不執行,即不允許事務部分的完成不可能停滯在中間

某個環節。事務在執行過程中發生錯誤,會被回滾(ro

llback)到事務開始前的狀態,就像這個事務從來沒有執

行過一樣。

b.一致性:

在事務開始之前和事務結束以後,資料庫的完整性約束沒

有被破壞。

c.隔離性:

隔離狀態執行事務,使它們好像是系統在給定時間內執行

的唯一操作。如果有兩個事務,執行在相同的時間內,執

行 相同的功能,事務的隔離性將確保每一事務在系統中認

為只有該事務在使用系統。這種屬性有時稱為序列化,為

了防止事務操作間的混淆, 必須序列化或序列化請 求,

使得在同一時間僅有乙個請求用於同一資料。

d.永續性:

在事務完成以後,該事務所對資料庫所作的更改便持久的

儲存在資料庫之中,並不會被回滾。

3.案例

此處用到的表

a轉賬給b

我們就普通的轉賬而不用事務,就相當於是普通的修改,值也是需要手動去給的,然而用事務的話,我們就可以直接寫個儲存過程,然後自動呼叫,會簡單很多

update customers set remain=remain-

100where name=a

update customers set remain=remain+

100where name=b

–用事務寫

先建立乙個儲存過程,定義三個我們所需要的變數,轉賬的賬號,收錢的賬號,金額

alter

proc cp_charge(

@idout

int,

@idin

int,

@remain

decimal(18

,2))

在開始事務,首先我們要定義變數去記錄錯誤的數量,

就比如說 a轉賬給b,b沒有收到,然而錢也沒了,所以我們要用乙個變數去接收這個錯誤的資訊,

as

--張三轉賬給李四

--開始事務

begin

transaction tran_chargc

--定義變數記錄錯誤數

declare

@err_nums

intset

@err_nums=0

begin try

--開始轉賬(修改)

update customers set remain=remain-

@remain

where id=

@idout

set@err_nums

=@err_nums

+@@error

update customers set remain=remain+

@remain

where id=

@idin

set@err_nums

=@err_nums

+@@error

end try

begin catch

print

'錯誤編號:'

+convert

(varchar

,error_number())

+'錯誤訊息'

+error_message(

)set

@err_nums

=@err_nums+1

end catchif(

@err_nums

>0)

--說明語句有錯

rollback

transaction tran_chargc --回滾事務

else

commit

transaction tran_chargc --提交事務

--呼叫儲存過程

exec cp_charge 10,11

,100

select

*from customers

BugHD 與你的應用一起成長

bughd sdk 1.3.0新增安裝量 啟動量的統計功能,在崩潰分析頁面右上角可看到安裝量和啟動量。android sdk 1.3.3 上線,修復 android sdk 自定義引數的中文顯示問題 這裡,你可能會問 什麼是 android sdk 自定義引數功能 sdk 快速配置完成後,可使用 自...

更新日誌 BugHD 與你的應用一起成長

bughd sdk 1.3.0新增安裝量 啟動量的統計功能,在崩潰分析頁面右上角可看到安裝量和啟動量。android sdk 1.3.3 上線,修復 android sdk 自定義引數的中文顯示問題 這裡,你可能會問 什麼是 android sdk 自定義引數功能 sdk 快速配置完成後,可使用 自...

兩年的日子,我與你一起度過!

今天是2010年7月14日,兩年前的今天我正式加入團隊成為了當時的成員之一。當初我依稀記得4位成員位於國際華城3505室俯瞰黃浦江的乙個小房間裡,把各自的夢想匯聚到乙個叫的地方。朝著乙個共同的目標 打造程式設計師的網上家園,而努力著。今天就先開個頭,利用接下來幾天的時間,簡單扼要的總結一下自己這兩年...