資源描述:
《SQLSERVER課件-事務(wù)與鎖》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、事務(wù)和鎖課程目標(biāo)創(chuàng)建事務(wù)提交事務(wù)回滾事務(wù)回滾事務(wù)的一部分用鎖解決潛在問(wèn)題SQLServer鎖設(shè)置鎖選項(xiàng)事務(wù)例:要進(jìn)行貨物調(diào)撥,把指定倉(cāng)庫(kù)中的一定數(shù)量的商品調(diào)撥到另一個(gè)倉(cāng)庫(kù)中。問(wèn):(如何確保這個(gè)操作一定可以一起完成)設(shè)置多個(gè)操作必須全部執(zhí)行成功,否則立即恢復(fù)到未執(zhí)行任何操作時(shí)的狀態(tài)是一個(gè)邏輯工作單元,單元中包含一批操作具有ACID四個(gè)性質(zhì)原子性:不可只完成部分操作一致性:在處理成功后,所有數(shù)據(jù)都保持一致?tīng)顟B(tài)獨(dú)立性:禁止其它事務(wù)看到本事務(wù)的中間狀態(tài)持久性:一個(gè)已完成的事務(wù)對(duì)數(shù)據(jù)所作的任何變動(dòng)在系統(tǒng)中是永久有效的自定義事務(wù)BeginTransaction
2、[事務(wù)名]執(zhí)行自定義事務(wù)CommitTransaction[事務(wù)名]如果全部成功,提交事務(wù)SaveTransaction保存點(diǎn)名顧名思義,定義事務(wù)的某個(gè)執(zhí)行位置RollbackTransaction[保存點(diǎn)名]回滾事務(wù)到事務(wù)的保存點(diǎn)位置注:1、如果回滾到保存點(diǎn),并不提交事務(wù)2、@@trancount存儲(chǔ)當(dāng)前的事務(wù)數(shù)量自定義事務(wù)的實(shí)現(xiàn)方式Rollback問(wèn):如有下列操作系列,結(jié)果會(huì)如何begintransactionupdatestudentsetcphone=‘12345678’wheresid=‘A00001’updatestudentsetcn
3、ame=‘a(chǎn)aa’wheresid=‘A00001’rollbacktransactionRollback例:如果在調(diào)撥過(guò)程中要求記載下來(lái)調(diào)撥信息,若發(fā)現(xiàn)被調(diào)貨的倉(cāng)庫(kù)的庫(kù)存不夠,則整個(gè)操作全部取消事務(wù)類型顯示事務(wù):由用戶指定事務(wù)的開(kāi)始和結(jié)束自動(dòng)事務(wù):每個(gè)語(yǔ)句視為一個(gè)事務(wù)隱式事務(wù):開(kāi)始執(zhí)行語(yǔ)句就視為一個(gè)事務(wù)的開(kāi)始,但語(yǔ)句執(zhí)行完后,事務(wù)并不結(jié)束(由用戶顯示提交)setimplicit_transactions{on
4、off}數(shù)據(jù)并行問(wèn)題所謂數(shù)據(jù)并行的問(wèn)題就是指當(dāng)數(shù)據(jù)同時(shí)進(jìn)行事務(wù)處理時(shí)所發(fā)生的問(wèn)題。數(shù)據(jù)并行問(wèn)題1、遺失更新:當(dāng)兩個(gè)或多個(gè)事務(wù)試圖修改同一行
5、時(shí),事務(wù)隊(duì)列中最后的更新會(huì)重寫(xiě)前面事務(wù)所作的修改資源A=100事務(wù)A事務(wù)BreadAreadAupdateA+50writeAupdateA+10writeA數(shù)據(jù)并行問(wèn)題2、無(wú)效讀入:一個(gè)事務(wù)讀取了尚未認(rèn)可的更新數(shù)據(jù)資源A=100事務(wù)A事務(wù)BreadAupdateA+50readAwriteAupdateA+10rollbackwriteA數(shù)據(jù)并行問(wèn)題3、不一致分析:指事務(wù)連續(xù)兩次讀取數(shù)據(jù)時(shí),所得到的數(shù)據(jù)不一致資源A=100事務(wù)A事務(wù)BreadAupdateA+50readAupdateA+10readAwriteA數(shù)據(jù)并行問(wèn)題4、幻象讀?。鹤x取到
6、了并不存在的數(shù)據(jù)資源A=100事務(wù)A事務(wù)BreadAupdateA+50createBreadAreadBdelBupdateB+80writeB鎖并行問(wèn)題的解決方法:鎖在功能上避免用戶訪問(wèn)正在被其它用戶改變的信息,在多用戶環(huán)境中,避免一些用戶同時(shí)改變同樣的數(shù)據(jù)SQLServer使用鎖來(lái)維護(hù)多用戶環(huán)境下的數(shù)據(jù)的一致性,SQLServer自動(dòng)處理鎖的行為鎖Server實(shí)現(xiàn)了多粒度上鎖,允許事務(wù)以不同級(jí)別對(duì)不同類型的資源上鎖行級(jí)頁(yè)級(jí)范圍表級(jí)共享鎖定(S):常用于讀事務(wù),允許一個(gè)資源上有多個(gè)共享鎖定,防止其它事務(wù)修改資源排它鎖定(X):用于寫(xiě)事務(wù),一個(gè)資
7、源上只能有一個(gè)排它鎖定,防止并發(fā)事務(wù)對(duì)資源進(jìn)行訪問(wèn)更新鎖定(U):用于防止死鎖,一個(gè)資源上只能有一個(gè)更新鎖定,且只有獲得更新鎖定的事務(wù)才能獲得排它鎖定意向鎖定(I):讓事務(wù)聲明它將在資源上使用共享、獨(dú)占、更新鎖定模式鎖定(S):1、結(jié)構(gòu)模式修改鎖定2、結(jié)構(gòu)描述固定鎖定鎖定模式例:用戶A用戶BBegintransactionbegintransactionupdatestudentupdateclasssetcclassid=‘c0002’setiperson=iperson+1select*fromclasswherecclassid=‘c0001
8、’Committransactionselect*fromstudentcommittransaction若這兩個(gè)事務(wù)共時(shí)提交會(huì)產(chǎn)生什么情況分析死鎖StudentClassTRANSACTIONATRANSACTIONB死鎖:是兩個(gè)用戶分別鎖定了不同的對(duì)象,且又試圖訪問(wèn)另一個(gè)用戶鎖定對(duì)象時(shí)產(chǎn)生的理解鎖當(dāng)產(chǎn)生死鎖時(shí),SQL-Server會(huì)終止占用最少CPU時(shí)間的進(jìn)程,終止的事務(wù)會(huì)自動(dòng)回滾,并給出一個(gè)1205的錯(cuò)誤SQLServer提供SETDEADLOCK_PRIORITY命令來(lái)定制死鎖語(yǔ)法SETDEADLOCK_PRIORITY{LOW
9、NORMA
10、L
11、@deadlock_var}定制LOCK_TIMEOUTSETLOCK_TIMEOUT命令可被用來(lái)設(shè)置等待被阻塞資源語(yǔ)