Java程序员从笨鸟到菜鸟之(九)——数据库有关知识补充(事务、视图、索引、存储过程)
本文來(lái)自:曹勝歡博客專欄。轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.NET/csh624366188
?
一:事務(wù)
首先看一下什么是事務(wù):
?通俗的理解,事務(wù)是一組原子操作單元,從數(shù)據(jù)庫(kù)角度說(shuō),就是一組SQL指令,要么全部執(zhí)行成功,若因?yàn)槟硞€(gè)原因其中一條指令執(zhí)行有錯(cuò)誤,則撤銷先前執(zhí)行過(guò)的所有指令。更簡(jiǎn)答的說(shuō)就是:要么全部執(zhí)行成功,要么撤銷不執(zhí)行。?
然后看一下事務(wù)要遵循的ISO/IEC所制定的ACID原則:
ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫(xiě)。
1.事務(wù)的原子性表示事務(wù)執(zhí)行過(guò)程中的任何失敗都將導(dǎo)致事務(wù)所做的任何修改失效。
2.一致性表示當(dāng)事務(wù)執(zhí)行失敗時(shí),所有被該事務(wù)影響的數(shù)據(jù)都應(yīng)該恢復(fù)到事務(wù)執(zhí)行前的狀態(tài)。
3.隔離性表示在事務(wù)執(zhí)行過(guò)程中對(duì)數(shù)據(jù)的修改,在事務(wù)提交之前對(duì)其他事務(wù)不可見(jiàn)。
4.持久性表示已提交的數(shù)據(jù)在事務(wù)執(zhí)行失敗時(shí),數(shù)據(jù)的狀態(tài)都應(yīng)該正確。?
看一下一些準(zhǔn)備知識(shí):
1.T-SQL使用下列語(yǔ)句來(lái)管理事務(wù):
開(kāi)始事務(wù):BEGIN?TRANSACTION
提交事務(wù):COMMIT?TRANSACTION
回滾(撤銷)事務(wù):ROLLBACK?TRANSACTION
一旦事務(wù)提交或回滾,則事務(wù)結(jié)束。
2.判斷某條語(yǔ)句執(zhí)行是否出錯(cuò):
使用全局變量@@ERROR
@@ERROR只能判斷當(dāng)前一條T-SQL語(yǔ)句執(zhí)行是否有錯(cuò),為了判斷事務(wù)中所有T-SQL語(yǔ)句是否有錯(cuò),我們需要對(duì)錯(cuò)誤進(jìn)行累計(jì)
????????????如:?SET?@errorSum=@errorSum+@@error
了解一下事務(wù)的分類:
顯示事務(wù):用BEGIN?TRANSACTION明確指定事務(wù)的開(kāi)始,這是最常用的事務(wù)類型
隱性事務(wù):通過(guò)設(shè)置SET?IMPLICIT_TRANSACTIONS?ON?語(yǔ)句,將隱性事務(wù)模式設(shè)置為打開(kāi),下一個(gè)語(yǔ)句自動(dòng)啟動(dòng)一個(gè)新事務(wù)。當(dāng)該事務(wù)完成時(shí),再下一個(gè)?T-SQL?語(yǔ)句又將啟動(dòng)一個(gè)新事務(wù)
自動(dòng)提交事務(wù):這是?SQL?Server?的默認(rèn)模式,它將每條單獨(dú)的?T-SQL?語(yǔ)句視為一個(gè)事務(wù),如果成功執(zhí)行,則自動(dòng)提交;如果錯(cuò)誤,則自動(dòng)回滾
使用事務(wù)解決經(jīng)典銀行轉(zhuǎn)賬事務(wù)問(wèn)題
T-SQL語(yǔ)句:
[sql]?view plaincopy print?
Javaj調(diào)用數(shù)據(jù)庫(kù)事務(wù)方法在ava程序員從笨鳥(niǎo)到菜鳥(niǎo)之(七)一—java數(shù)據(jù)庫(kù)操作
已經(jīng)提到過(guò)了。在此就不在陳述了
二:索引
首先看一下什么事索引(以sqlserver為例):
SQL?Server中的數(shù)據(jù)也是按頁(yè)(?4KB?)存放
索引:是SQL?Server編排數(shù)據(jù)的內(nèi)部方法。它為SQL?Server提供一種方法來(lái)編排查詢數(shù)據(jù)?
索引頁(yè):數(shù)據(jù)庫(kù)中存儲(chǔ)索引的數(shù)據(jù)頁(yè);索引頁(yè)類似于漢語(yǔ)字(詞)典中按拼音或筆畫(huà)排序的目錄頁(yè)
索引的作用:通過(guò)使用索引,可以大大提高數(shù)據(jù)庫(kù)的檢索速度,改善數(shù)據(jù)庫(kù)性能
然后看一下索引的類型:
1.唯一索引:唯一索引不允許兩行具有相同的索引值
2.主鍵索引:為表定義一個(gè)主鍵將自動(dòng)創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個(gè)值是唯一的,并且不能為空
3.聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個(gè)表只能有一個(gè)
4.非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數(shù)據(jù)存儲(chǔ)在一個(gè)位置,索引存儲(chǔ)在另一個(gè)位置,索引中包含指向數(shù)據(jù)存儲(chǔ)位置的指針。可以有多個(gè),小于249個(gè)
示例:利用企業(yè)管理器創(chuàng)建索引
使用T-SQL語(yǔ)句創(chuàng)建索引的語(yǔ)法:
CREATE?[UNIQUE]?[CLUSTERED|NONCLUSTERED]??
????INDEX???index_name
?????ON?table_name?(column_name…)
??????[WITH?FILLFACTOR=x]
注:UNIQUE表示唯一索引,可選
CLUSTERED、NONCLUSTERED表示聚集索引還是非聚集索???????????引,可選
FILLFACTOR表示填充因子,指定一個(gè)0到100之間的值,
該值指示索引頁(yè)填滿的空間所占的百分比
創(chuàng)建索引示例:
[sql]?view plaincopy print?
索引的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):1.加快訪問(wèn)速度2.加強(qiáng)行的唯一性
缺點(diǎn):1.帶索引的表在數(shù)據(jù)庫(kù)中需要更多的存儲(chǔ)空間
2.操縱數(shù)據(jù)的命令需要更長(zhǎng)的處理時(shí)間,因?yàn)樗鼈冃枰獙?duì)索引進(jìn)行更新
三:視圖
首先還是先看一下什么事視圖:
視圖是一張?zhí)摂M表,它表示一張表的部分?jǐn)?shù)據(jù)或多張表的綜合數(shù)據(jù),其結(jié)構(gòu)和數(shù)據(jù)是建立在對(duì)表的查詢基礎(chǔ)上。視圖中并不存放數(shù)據(jù),而是存放在視圖所引用的原始表(基表)中同一張?jiān)急?#xff0c;根據(jù)不同用戶的不同需求,可以創(chuàng)建不同的視圖
使用企業(yè)管理器創(chuàng)建視圖:
使用T-SQL語(yǔ)句創(chuàng)建視圖的語(yǔ)法:
CREATE?VIEW?view_name??
???AS
????<select語(yǔ)句>
示例:創(chuàng)建方便教員查看成績(jī)的視圖
[sql]?view plaincopy print?
四:存儲(chǔ)過(guò)程:
首先還是來(lái)看一下什么事存儲(chǔ)過(guò)程:
存儲(chǔ)過(guò)程(Stored?Procedure)是在大型數(shù)據(jù)庫(kù)系統(tǒng)中,一組為了完成特定功能的SQL?語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。
存儲(chǔ)過(guò)程(procedure)類似于Java語(yǔ)言中的方法
用來(lái)執(zhí)行管理任務(wù)或應(yīng)用復(fù)雜的業(yè)務(wù)規(guī)則
存儲(chǔ)過(guò)程可以帶參數(shù),也可以返回結(jié)果
存儲(chǔ)過(guò)程的有點(diǎn):
執(zhí)行速度更快
允許模塊化程序設(shè)計(jì)?
提高系統(tǒng)安全性
減少網(wǎng)絡(luò)流通量
存儲(chǔ)過(guò)程分類:
1.系統(tǒng)存儲(chǔ)過(guò)程
由系統(tǒng)定義,存放在master數(shù)據(jù)庫(kù)中,類似Java語(yǔ)言類庫(kù)中的方法。
系統(tǒng)存儲(chǔ)過(guò)程的名稱都以“sp_”開(kāi)頭或“xp_”開(kāi)頭
2.用戶自定義存儲(chǔ)過(guò)程
由用戶在自己的數(shù)據(jù)庫(kù)中創(chuàng)建的存儲(chǔ)過(guò)程,類似Java語(yǔ)言中用戶自定義的方法
常用的系統(tǒng)存儲(chǔ)過(guò)程
定義存儲(chǔ)過(guò)程的語(yǔ)法
????CREATE??PROC[EDURE]??存儲(chǔ)過(guò)程名?
??????????????@參數(shù)1??數(shù)據(jù)類型?=?默認(rèn)值?OUTPUT,
??????????????……?,
?????????????@參數(shù)n??數(shù)據(jù)類型?=?默認(rèn)值?OUTPUT
?????????????AS
????????????SQL語(yǔ)句
????Go
和Java語(yǔ)言的方法一樣,參數(shù)可選
參數(shù)分為輸入?yún)?shù)、輸出參數(shù)?
輸入?yún)?shù)允許有默認(rèn)值
先給出一個(gè)不帶輸入?yún)?shù)的存儲(chǔ)過(guò)程的例子:
[sql]?view plaincopy print?
執(zhí)行存儲(chǔ)過(guò)程的語(yǔ)法:
調(diào)用的語(yǔ)法
EXEC??過(guò)程名??[參數(shù)]
存儲(chǔ)過(guò)程的參數(shù)分兩種:1.輸入?yún)?shù)2.輸出參數(shù)
輸入?yún)?shù):用于向存儲(chǔ)過(guò)程傳入值,類似Java帶參方法
輸出參數(shù):用于在調(diào)用存儲(chǔ)過(guò)程后,返回結(jié)果
帶輸入?yún)?shù)的存儲(chǔ)過(guò)程:
修改上例子:由于每次考試的難易程度不一樣,每次筆試和機(jī)試的及格線可能隨時(shí)變化(不再是60分),這導(dǎo)致考試的評(píng)判結(jié)果也相應(yīng)變化
調(diào)用上面的存儲(chǔ)過(guò)程:
[sql]?view plaincopy print?
EXEC?proc_stu?60,55??
--或這樣調(diào)用:
EXEC?proc_stu?@labPass=55,@writtenPass=60
擴(kuò)展:設(shè)置輸入的默認(rèn)值:
--或這樣調(diào)用:
EXEC?proc_stu
?@labPass=55,
@writtenPass=60
CREATE?PROCEDURE?proc_stu?
??@writtenPass?int=60,??
??@labPass?int=60????
??AS
。。。。。。
調(diào)用帶參數(shù)默認(rèn)值的存儲(chǔ)過(guò)程
EXEC?proc_stu???--都采用默認(rèn)值?
EXEC?proc_stu?64??--機(jī)試采用默認(rèn)值?
EXEC?proc_stu?60,55???--都不采用默認(rèn)值?
--錯(cuò)誤的調(diào)用方式:希望筆試采用默認(rèn)值,機(jī)試及格線55分
EXEC?proc_stu??,55?
--正確的調(diào)用方式:
EXEC?proc_stu?@labPass=55
如果希望調(diào)用存儲(chǔ)過(guò)程后,返回一個(gè)或多個(gè)值,這時(shí)就需要使用輸出(OUTPUT)參數(shù)了
[html]?view plaincopy print?
調(diào)用帶輸出參數(shù)的存儲(chǔ)過(guò)程
[sql]?view plaincopy print?
?本文來(lái)自:曹勝歡博客專欄。轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.Net/csh624366188
總結(jié)
以上是生活随笔為你收集整理的Java程序员从笨鸟到菜鸟之(九)——数据库有关知识补充(事务、视图、索引、存储过程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java程序员从笨鸟到菜鸟之(八)反射和
- 下一篇: Java程序员从笨鸟到菜鸟之(十)枚举,