第8講授課題目:第六章 事務(wù)_第1頁
第8講授課題目:第六章 事務(wù)_第2頁
第8講授課題目:第六章 事務(wù)_第3頁
第8講授課題目:第六章 事務(wù)_第4頁
第8講授課題目:第六章 事務(wù)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

數(shù)據(jù)庫應(yīng)用與設(shè)計課程教案第4頁

第8講授課題目:第六章事務(wù)教學(xué)時數(shù):2學(xué)時授課類型:理論課□理論、實驗課□實踐課教學(xué)目的、要求:1、了解事務(wù)的概念以及事務(wù)的四大特性;2、掌握事務(wù)的開始、回滾以及提交方法;3、能用事務(wù)解決實際問題。教學(xué)重點:1、事務(wù)的開始、回滾以及提交方法;2、用事務(wù)解決實際問題教學(xué)難點:1、如何利用事務(wù)解決銀行轉(zhuǎn)賬出錯的問題,實現(xiàn)正確的轉(zhuǎn)賬過程。2、如何利用事務(wù)解決生活中其他實際問題教學(xué)方法和手段:1、教學(xué)方法:在教學(xué)中選用了大家都熟知的生活事例“銀行轉(zhuǎn)賬”,通過轉(zhuǎn)賬過程中出現(xiàn)賬戶金額錯誤,發(fā)現(xiàn)問題所在于update修改語句與check約束發(fā)生沖突,從而引出事務(wù),誘導(dǎo)學(xué)生利用事務(wù)去解決這類問題。教學(xué)中采用了“小組討論”,“學(xué)生探究”,“任務(wù)驅(qū)動”,“師生互動”等方法。2、教學(xué)手段:采用多媒體課件教學(xué)與板書相結(jié)合3、板書設(shè)計

教學(xué)內(nèi)容及過程旁批教學(xué)內(nèi)容與教學(xué)設(shè)計:環(huán)節(jié)一:知識回顧【課堂互動】(計劃用時4分鐘):教師與學(xué)生一起復(fù)習(xí)以前學(xué)習(xí)過的插入記錄和修改記錄語句,并用2個例子加深理解,為后面的創(chuàng)建事務(wù)打下基礎(chǔ)。插入記錄:INSERTINTO<table_name>[(<column1>[,<column2>…])]VALUES(<expression1>[,<expression2>]…)例:向SC表插入一條學(xué)號為S2,課程號為C2的記錄INSERTINTOSC(Sno,Cno)VALUES(‘S2’,'c2')修改記錄:UPDATE<表名>SET<字段名1>=<表達式1>[,<字段名2>=<表達式2>]…[WHERE<條件>]例:將李思轉(zhuǎn)到計算機系UPDATESSETDEPT=’計算機’WHERESN=’李思’環(huán)節(jié)二:本章重難點【教師引導(dǎo)】(計劃用時2分鐘):教師引導(dǎo)學(xué)生本章的主要內(nèi)容,以及本次課程需要掌握的重點和難點。1、事務(wù)的四大特性2、事務(wù)的開始、提交、回滾方法3、用事務(wù)解決銀行轉(zhuǎn)賬的問題環(huán)節(jié)三:案例引入【討論引入】(計劃用時2分鐘):教師描述大家都熟知的生活實例“銀行轉(zhuǎn)賬”,并提問:假定資金從帳戶A轉(zhuǎn)到帳戶B,至少需要幾步完成?銀行轉(zhuǎn)帳問題:假定將帳戶A的資金1000元轉(zhuǎn)到帳戶B中,至少需要幾步完成?1.帳戶A的資金減少1000元2.帳戶B的資金相應(yīng)增加1000元【課堂討論】(計劃用時2分鐘):問題1:轉(zhuǎn)賬之前必須先開戶,在數(shù)據(jù)庫中如何實現(xiàn)開戶?學(xué)生自由回答?!窘處熞龑?dǎo)】(計劃用時1分鐘):顧客在銀行開戶的過程,在數(shù)據(jù)庫中實現(xiàn)時,實際就是創(chuàng)建一張數(shù)據(jù)表,表中設(shè)置2個字段,分別存放需要開戶的顧客姓名和金額。利用以前學(xué)習(xí)過的知識和學(xué)生一起完成代碼:/*創(chuàng)建賬戶表:CREATETABLEbank(customerNameCHAR(10),/*顧客姓名currentMoneyMONEY/*當(dāng)前余額)GO【師生互動】(計劃用時1分鐘):問題2:此時創(chuàng)建的表格僅僅是表結(jié)構(gòu),沒有實際數(shù)據(jù),在數(shù)據(jù)庫中如何實現(xiàn)資金存入賬戶?學(xué)生回答:客戶資金入賬,就是使用Insert命令向bank表中插入數(shù)據(jù)。向bank表中插入數(shù)據(jù)語句為(計劃用時1分鐘):CREATETABLEbank(customerNameCHAR(10),/*顧客姓名currentMoneyMONEY/*當(dāng)前余額)GO【教師提問】(計劃用時2分鐘):問題3:表格雖然已經(jīng)創(chuàng)建完成,但是根據(jù)銀行規(guī)定,每個顧客帳戶余額不能少于1元,否則視為銷戶,為了保證不銷戶,怎樣限制賬戶余額>=1?師生共同分析:為了保證每位顧客余額大于等于1,我們需要在余額字段CurrentMoney上添加一個CHECK約束,來限制CurrentMoney字段值>=1即可教師演示完整代碼(計劃用時2分鐘):/*創(chuàng)建賬戶表:CREATETABLEbank(customerNameCHAR(10),/*顧客姓名currentMoneyMONEY/*當(dāng)前余額)GO/*添加約束:帳戶余額不能少于1元ALTERTABLEbankADDCONSTRAINTCK_currentMoneyCHECK(currentMoney>=1)GO/*張三開戶,開戶金額為1000元;李四開戶,開戶金額1元:INSERTINTObank(customerName,currentMoney)VALUES('張三',1000)INSERTINTObank(customerName,currentMoney)VALUES('李四',1)【教師系統(tǒng)演示】(計劃用時1分鐘):教師在數(shù)據(jù)庫軟件中演示成功創(chuàng)建bank表的過程,并向?qū)W生展示結(jié)果。教師展示創(chuàng)建成功的bank表結(jié)果?!窘處熖釂枴浚ㄓ媱澯脮r2分鐘):問題4:如何實現(xiàn)轉(zhuǎn)賬過程?教師引導(dǎo):請大家回想一下自己在銀行轉(zhuǎn)賬的時候,銀行卡里的數(shù)據(jù)是怎樣發(fā)生變化的?學(xué)生自由回答教師引導(dǎo):轉(zhuǎn)賬的過程是將張三賬戶的金額減少1000元,同時李四賬戶的金額增加1000元,在數(shù)據(jù)表中的處理過程實際就是使用update語句對currentmoney字段的值做修改操作。具體代碼如下(計劃用時1分鐘):UPDATEbankSETcurrentMoney=currentMoney-1000WHEREcustomerName='張三'UPDATEbankSETcurrentMoney=currentMoney+1000WHEREcustomerName='李四'環(huán)節(jié)四:發(fā)現(xiàn)問題【教師系統(tǒng)演示】(計劃用時4分鐘):教師在數(shù)據(jù)庫軟件中模擬實現(xiàn)轉(zhuǎn)帳過程,并向?qū)W生展示結(jié)果。教師模擬實現(xiàn)轉(zhuǎn)帳過程:從張三的帳戶轉(zhuǎn)帳1000元到李四的帳戶,轉(zhuǎn)帳之前,余額總和為:1000+1=1001元,轉(zhuǎn)帳之后,余額總和為:1000+1001=2001元,總額多出了1000元!環(huán)節(jié)五:分析問題【師生共同分析】(計劃用時4分鐘):教師和學(xué)生根據(jù)錯誤結(jié)果以及系統(tǒng)報錯提示一起分析錯誤原因師生共同分析錯誤原因:通過報錯提示得出update修改語句與check約束發(fā)生沖突,為什么會發(fā)生沖突呢?修改張三金額的第一個update語句將張三余額變?yōu)?,而根據(jù)銀行規(guī)定,帳戶余額不能少于1元,否則視為銷戶,所以,第一個update語句違反了check約束:余額>=1元,即第一個update語句沒有執(zhí)行,也就是張三的的金額并沒有減少1000元。環(huán)節(jié)六:解決問題(重點)【教師提問】(計劃用時2分鐘):問題5:通過剛才分析,我們已經(jīng)找到了錯誤原因,那么如何解決呢?概念引入:使用事務(wù)!教師講解:教師詳細講解事務(wù)的概念、事務(wù)的四大特性、事務(wù)的創(chuàng)建方法1、事務(wù)的概念(計劃用時4分鐘)事務(wù)(TRANSACTION):是作為單個邏輯工作單元執(zhí)行的一系列操作,這些操作作為一個整體一起向系統(tǒng)提交,要么都執(zhí)行、要么都不執(zhí)行。事務(wù)是一個不可分割的工作邏輯單元。2、事務(wù)的四大特性(計劃用時5分鐘)原子性(Atomicity):事務(wù)是一個完整的操作。事務(wù)的各步操作是不可分的(原子的);要么都執(zhí)行,要么都不執(zhí)行一致性(Consistency):當(dāng)事務(wù)完成時,數(shù)據(jù)必須處于一致狀態(tài)隔離性(Isolation):對數(shù)據(jù)進行修改的所有并發(fā)事務(wù)是彼此隔離的,它不應(yīng)以任何方式依賴于或影響其他事務(wù)永久性(Durability):事務(wù)完成后,它對數(shù)據(jù)庫的修改被永久保持。3、T-SQL使用下列語句來管理事務(wù)(計劃用時4分鐘)開始事務(wù):BEGINTRANSACTION提交事務(wù):COMMITTRANSACTION回滾(撤銷)事務(wù):ROLLBACKTRANSACTION【課堂討論】(計劃用時5分鐘):問題6:我們已經(jīng)詳細學(xué)習(xí)了事務(wù)的基本原理,那么,怎么樣利用事務(wù)解決的錯誤銀行轉(zhuǎn)帳問題?學(xué)生討論回答:轉(zhuǎn)帳過程就是一個事務(wù)。它需要兩條UPDATE語句來完成,這兩條語句是一個整體,如果其中任一條出現(xiàn)錯誤,則整個轉(zhuǎn)帳業(yè)務(wù)也應(yīng)取消,兩個帳戶中的余額應(yīng)恢復(fù)到原來的數(shù)據(jù),從而確保轉(zhuǎn)帳前和轉(zhuǎn)帳后的余額不變,即都是1001元。教師對關(guān)鍵語句講解(計劃用時9分鐘)BEGINTRANSACTION/*--定義變量,用于累計事務(wù)執(zhí)行過程中的錯誤--*/DECLARE@errorSumINTSET@errorSum=0/*--初始化為0,即無錯誤/*--轉(zhuǎn)帳:張三的帳戶少1000元,李四的帳戶多1000元*/UPDATEbankSETcurrentMoney=currentMoney-1000WHEREcustomerName='張三'SET@errorSum=@errorSum+@@errorUPDATEbankSETcurrentMoney=currentMoney+1000WHEREcustomerName='李四'SET@errorSum=@errorSum+@@error/*--累計是否有錯誤IF@errorSum<>0/*--如果有錯誤BEGINprint'交易失敗,回滾事務(wù)'ROLLBACKTRANSACTIONENDELSEBEGINprint'交易成功,提交事務(wù),寫入硬盤,永久的保存'COMMITTRANSACTIONENDGOprint'查看轉(zhuǎn)帳事務(wù)后的余額'SELECT*FROMbankGO過程分析(計劃用時7分鐘):1、開戶后并開始事務(wù),定義變量@errorSum,用于累計事務(wù)執(zhí)行過程中的錯誤;2、使用兩個update語句實現(xiàn)轉(zhuǎn)帳:張三的帳戶少1000元,李四的帳戶多1000元;3、張三賬戶減少1000元后,使用@errorSum變量計算出執(zhí)行過程中的錯誤個數(shù),同理,李四賬戶增加1000元后,繼續(xù)使用@errorSum變量累計計算出執(zhí)行過程中的錯誤個數(shù);4、使用雙分支語句去判斷@errorSum的最終值,如果@errorSum<>0,說明有錯誤,則回滾事務(wù)ROLLBACKTRANSACTION,否則,說明沒有錯誤,則提交事務(wù)COMMITTRANSACTION?!窘處熛到y(tǒng)演示】(計劃用時5分鐘):教師在數(shù)據(jù)庫軟件中模擬實現(xiàn)轉(zhuǎn)帳過程,向?qū)W生展示轉(zhuǎn)賬1000元和800元的結(jié)果,并做對比分析。教師將轉(zhuǎn)帳1000元失敗的情況與成功轉(zhuǎn)賬轉(zhuǎn)帳800元的情況做對比分析,讓學(xué)生了解使用事務(wù)執(zhí)行過程的區(qū)別。轉(zhuǎn)賬1000元失敗的情況:轉(zhuǎn)賬800元成功的情況:【教師對比分析】(計劃用時4分鐘):教師在黑板上演示對比分析過程:我們將利用事務(wù)轉(zhuǎn)賬和沒有利用事務(wù)轉(zhuǎn)賬的結(jié)果做了對比分析,得出沒有利用事務(wù)轉(zhuǎn)賬時,兩條update語句只執(zhí)行了第一條,所以導(dǎo)致了錯誤的轉(zhuǎn)賬結(jié)果;而利用事務(wù)轉(zhuǎn)賬后,兩條update都沒有執(zhí)行,事務(wù)回滾到開始狀態(tài),所以得到正確的轉(zhuǎn)賬結(jié)果。環(huán)節(jié)七:知識小結(jié)【教師總結(jié)】(計劃用時5分鐘)今天所學(xué)的主要知識點:a.事務(wù)的概念b.事務(wù)的特性:原子性一致性隔離性持久性c.如何創(chuàng)建事務(wù):開始事務(wù):BEGINTRANSACTION回滾(撤銷)事務(wù):ROLLBACKTRANSACTION提交事務(wù):COMMITTRANSACTION2、我們將利用事務(wù)轉(zhuǎn)賬和沒有利用事務(wù)轉(zhuǎn)賬的結(jié)果做了對比分析,得出沒有利用事務(wù)轉(zhuǎn)賬時,兩條update語句只執(zhí)行了第一條,所以導(dǎo)致了錯誤的轉(zhuǎn)賬結(jié)果;而利用事務(wù)轉(zhuǎn)賬后,兩條update都沒有執(zhí)行,事務(wù)回滾到開始狀態(tài),所以得到正確的轉(zhuǎn)賬結(jié)果。3、在使用事務(wù)的時候,值得注意的是,開始事務(wù)語句begintransaction必須要定義在所有的操作開始之前,這樣才能保證事務(wù)能夠回滾到開始狀態(tài)。環(huán)節(jié)八:課堂練習(xí)【學(xué)生分組練習(xí)】(計劃用時8分鐘):教師在數(shù)據(jù)庫軟件中演示程序,引導(dǎo)學(xué)生分組對程序功能進行分析,讓學(xué)生回答此程序的功能和運行結(jié)果,以及使用了數(shù)據(jù)庫的哪些知識點。【教師演示程序】use

BankSystem

use

master

go

create

DataBase

BankSystem

go

use

BankSystem

go

create

table

CardInfo

(

PKID

int

identity(1,1)

primary

key

,

CardNum

nvarchar(19)

not

null,

--卡號

Balance

money

default(0)

--余額

)

go

create

table

Transfer_Event

(

PKID

int

identity(1,1)

primary

key,

FromCardID

nvarchar(19)

not

null,

--源卡號

ToCardID

nvarchar(19)

not

null,

--目標卡號

TransMoney

money,

--金額

OccurTime

datetime

--發(fā)生時間

)

insert

into

CardInfo(CardNum,Balance)

values('123456789',80.8)

insert

into

CardInfo(CardNum,Balance)

values('123',10.9)

go

create

procedure

TranserMoney

(

@fromCardNum

varchar(19),

@toCardNum

varchar(19),

@tansMoney

Money,

@occurTime

DateTime

)

as

begin

declare

@cardNum

varchar(19)

declare

@balance

Money

--開始事務(wù)

begin

transaction

--定義游標

declare

cursorTransfer

cursor

for

select

CardNum,Balance

from

CardInfo

where

CardNum=@fromCardNum

open

cursorTransfer

--取字段值,放入@cardNum,@balance

fetch

next

from

cursorTransfer

into

@cardNum,@balance

while

@@FETCH_STATUS=0

--取游標狀態(tài)(0--表示成功)

begin

if(@balance>=@tansMoney)

begin

update

CardInfo

set

Balance=Balance-@tansMoney

where

CardNum=@fromCardNum

if

@@ERROR<>0

goto

ERR

--發(fā)生錯誤跳轉(zhuǎn)

update

CardInfo

set

Balance=Balance+@tansMoney

where

CardNum=@toCardNum

if

@@ERROR<>0

goto

ERR

insert

into

Transfer_Event(FromCardID,ToCardID,TransMoney,OccurTime)values(@fromCardNum,@toCardNum,@tansMoney,@occurTime)

if

@@ERROR<>0

goto

ERR

commit

transaction

close

cursorTransfer

-

deallocate

cursorTransfer

return

0

返回0

end

else

begin

rollback

transaction

--回滾事務(wù)

close

cursorTransfer

--關(guān)閉游標

deallocate

cursorTransfer

return

1

--執(zhí)行正常,返回0

end

end

end

ERR:--發(fā)生異常返回2

begin

rollback

transaction

--回滾事務(wù)

close

cursorTransfer

deallocate

cursorTransfer

return

2

end

go

--調(diào)用存儲過程

declare

@fromCardNum

nvarchar(19),@toCardNum

nvarchar(19),@money

money,@dateTime

DateTime,@flag

int

set

@fromCardNum='123456789'

set

@toCardNum='123'

set

@dateTime='2009-7-17'

set

@money=50

exec

@flag=

TranserMoney

@fromCardNum,@toCardNum,@money,@dateTime

select

@flag

select

*from

CardInfo;

select

*from

Transfer_Event;

【結(jié)束本次課的結(jié)語】(計劃用時2分鐘)通過本次課程的學(xué)習(xí),我們掌握了事務(wù)的概念;事務(wù)的四大特性:原子性、一致性、隔離性、持久性;以及創(chuàng)建事務(wù)的方法:開始事務(wù):Begintransaction、回滾(撤銷)事務(wù):Rollbacktransaction、提交事務(wù):Committransaction。同時,本次課程我們還學(xué)會

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論