數據庫特點、四大特徵、併發事務引起的問題

數據庫特點、四大特徵、併發事務引起的問題

數據庫4個基本特點:

1.數據結構化

2.數據的共享性高,冗餘度低,易擴充

3.數據獨立性

4.數據由DBMS統一管理和控制

 

特點:

共享性高,冗餘度低,易擴充

結構化

數據庫系統實現了整體數據的結構化,這是數據庫的最主要的特徵之一。這裏所說的“整體”結構化,是指在數據庫中的數據不再僅針對某個應用,而是面向全組織;不僅數據內部是結構化,而且整體式結構化,數據之間有聯繫。

共享性

數據的共享性高,冗餘度低,易擴充,因爲數據是面向整體的,所以數據可以被多個用戶、多個應用程序共享使用,可以大大減少數據冗餘,節約存儲空間,避免數據之間的不相容性與不一致性。

獨立性

數據獨立性

數據獨立性包括數據的物理獨立性和邏輯獨立性

物理獨立性是指數據在磁盤上的數據庫中如何存儲是由DBMS管理的,用戶程序不需要了解,應用程序要處理的只是數據的邏輯結構,這樣一來當數據的物理存儲結構改變時,用戶的程序不用改變。

邏輯獨立性是指用戶的應用程序與數據庫的邏輯結構是相互獨立的,也就是說,數據的邏輯結構改變了,用戶程序也可以不改變。

數據與程序的獨立,把數據的定義從程序中分離出去,加上存取數據的由DBMS負責提供,從而簡化了應用程序的編制,大大減少了應用程序的維護和修改。

數據由DBMS統一管理和控制

數據庫的共享是併發的(concurrency)共享,即多個用戶可以同時存取數據庫中的數據,甚至可以同時存取數據庫中的同一個數據。

DBMS必須提供以下幾方面的數據控制功能:

數據的安全性保護(security)

數據的完整性檢查(integrity)

數據庫的併發訪問控制(concurrency)

數據庫的故障恢復(recovery)

數據庫事物四大特性-ACID

目錄:

1.原子性

2.一致性

3.隔離性

4.持久性

 

n  原子性:(Atomicity)

比較官方說法:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。

理解:要麼全部做,要麼不做。

n  一致性:(consistency)

在事物開始以前,數據庫處於一致性的狀態,事物結束後,數據庫也必須處於一致性的狀態。

拿銀行轉賬來說,一致性要求事務的執行不應改變A、B兩個賬戶的金額總和。如果沒有這種一致性要求,轉賬過程中就會發生錢無中生有,或者不翼而飛的現象。事務應該把數據庫從一個一致性狀態轉換到另外一個一致性狀態。

銀行轉賬例子:

1.    數據庫使用SQLSERVER

①   :腳本:先創建一個account銀行賬戶表:

createtableaccount(

idintidentity(1,1)primarykey,

cardnochar(20),

moneynumeric(18,2)

)

insertintoaccountvalues('01',1000.0)

insertintoaccountvalues('02',1000.0)

 

實現方案1:

不考慮任何的條件,簡單實現兩個賬戶之間的轉賬操作。

參數:

@out_cardno:轉出賬戶

@in_cardno:轉入賬戶

@money:轉賬金額

CREATEPROCEDUREsp_transfer_money1

@out_cardnochar(20),

@in_cardnochar(20),

@moneynumeric(18,2)

AS

BEGIN

updateaccountsetmoney=money-@moneywherecardno=@out_cardno

updateaccountsetmoney=money+@moneywherecardno=@in_cardno

PRINT'轉賬成功.'

END

--執行上面的存儲過程

EXECsp_transfer_money1'01','02',1200.0

出現問題:

轉出賬戶”01”的只有1000塊,但是卻能夠成功的轉1200塊,這樣的做法是不可思議的。

實現方案2:

加入對轉出賬戶的餘額判斷:

CREATEPROCEDUREsp_transfer_money2

@out_cardnochar(20),

@in_cardnochar(20),

@moneynumeric(18,2)

AS

BEGIN

DECLARE@remainnumeric(18,2)

select@remain=moneyfromaccountwherecardno=@out_cardno

IF@remain>=@money

BEGIN

updateaccountsetmoney=money-@moneywherecardno=@out_cardno

updateaccountsetmoney=money+@moneywherecardno=@in_cardno

PRINT'轉賬成功.'

END

ELSE

BEGIN

PRINT'餘額不足.'

END

END

EXECsp_transfer_money2'01','02',1000.0

 

出現問題:

1.存儲過程的參數從外部出入,但是不能確定參數的合法性,一旦參數出現問題,執行存儲過程就可能發生錯誤,導致部分業務代碼執行不成功,發生數據不一致的問題。

2.缺少事務控制的管理

實現方案3:

CREATEPROCEDUREsp_transfer_money3

@out_cardnochar(20),

@in_cardnochar(20),

@moneynumeric(18,2)

as

BEGIN

DECLARE@remainnumeric(18,2)

select@remain=moneyfromaccountwherecardno=@out_cardno

if@remain>@money

BEGIN

BEGINTRANSACTIONT1

updateaccountsetmoney=money-@moneywherecardno=@out_cardno

updateaccountsetmoney=money+@moneywherecardno=@in_cardnoPRINT'轉賬成功.'

if@remain>@money

begin

rollbacktransaction

end

COMMITTRANSACTIONT1

END

ELSE

BEGIN

PRINT'餘額不足.'

END

END

 

EXECsp_transfer_money3'01','02',100.0

現實生活中的金融業務是相當複雜的,上面的幾個方案只是模擬了最基本的情況,譬如,跨行之間的轉賬,同行不同區的轉賬這些都是具體的業務需求。要把這些業務都使用存儲過程來實現的話,對我們的數據庫開發人員來說,要求就更高了。

 

 

n  隔離性:(Isolation)

理解一:

事務的隔離性要求系統必須保證事務不受其他併發執行的事務的影響,也既要達到這樣一種效果:對於任何一對事務T1和T2,在事務T1看來,T2要麼在T1開始之前執行,要麼在T1完成之後纔開始執行,這樣,每個事務都感覺不到系統中有併發事務執行。

理解二:

多個用戶併發訪問數據庫時,一個用戶的事務不能被其他用戶的事務所幹擾,多個併發事務之間數據要相互隔離。

n  持久性:(Durability)

指一個事務一旦被提交併且成功完成,它對數據庫的改變必須是永久的,它對數據庫的影響是永久性的。

即使是在系統遇到故障的情況下也不會丟失,數據的重要性決定了事物的持久性的重要。

數據庫完整性

數據庫完整性(Database Integrity)是指數據庫中數據在邏輯上的一致性、正確性、有效性和相容性。數據庫完整性由各種各樣的完整性約束來保證,因此可以說數據庫完整性設計就是數據庫完整性約束的設計。數據庫完整性約束可以通過DBMS或應用程序來實現,基於DBMS的完整性約束作爲模式的一部分存入數據庫中。通過DBMS實現的數據庫完整性按照數據庫設計步驟進行設計,而由應用軟件實現的數據庫完整性則納入應用軟件設計。

併發事務引起的問題:

更新丟失:

兩個事務都同時更新一行數據,但是第二個事務卻中途失敗退出,導致對數據的兩個修改都失效了。這是因爲系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。

髒讀:

髒讀又稱無效數據讀出。一個事務讀取另外一個事務還沒有提交的數據叫髒讀。

例如:事務T1修改了一行數據,但是還沒有提交,這時候事務T2讀取了被事務T1修改後的數據,之後事務T1因爲某種原因Rollback了,那麼事務T2讀取的數據就是髒的。

不可重複讀:

不可重複讀是指在同一個事務內,兩個相同的查詢返回了不同的結果。

例如:事務T1讀取某一數據,事務T2讀取並修改了該數據,T1爲了對讀取值進行檢驗而再次讀取該數據,便得到了不同的結果。

幻讀:

事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據或者缺少了第一次查詢中出現的數據

例如:系統管理員A將數據庫中所有學生的成績從具體分數改爲ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣。這就叫幻讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章