時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)
1.SQL Server 2005中的存儲過程并發(fā)問題
問:我在SQL Server2005中遇到了并發(fā)問題。我持有車票的公共汽車上有一些空閑的座位。我在插入銷售的查票之前,需要查看是否還有空閑的座位。我的存儲過程做的事情如下所示:
以下為引用的內(nèi)容: CREATE PROCEDURE add_ticket — parameters |
問題就是兩個(gè)過程可以同時(shí)讀取空閑票數(shù),并且都可以預(yù)約一張票,即使是那里已經(jīng)沒有空余的了。我需要一種方法來防止一個(gè)過程在另一個(gè)過程運(yùn)行add_ticket程序,但是還沒有插入一張新票的時(shí)候讀取空票的數(shù)量。
解答: 你是正確的;更高的隔離級別也不會保證多個(gè)讀者去同時(shí)去讀取同一個(gè)數(shù)據(jù)行。然而,還有幾種方法你可以完成這項(xiàng)工作。例如,你可以給每個(gè)座位分配一個(gè)惟一的標(biāo)識符(意思是,惟一鍵——不一定是GUID),并且創(chuàng)建一個(gè)描述哪些座位已經(jīng)被預(yù)訂了的表。在表上放一個(gè) UNIQUE約束,你就可以確保同一個(gè)座位不會被插入兩次了。
就是說,我認(rèn)為一個(gè)更有趣的方法就是使用SQL Service Broker。你可以為每個(gè)公交建立一個(gè)會話,并且將這個(gè)會話的句柄存放在一個(gè)表中,讀者在執(zhí)行RECEIVE之前可以參考這個(gè)表。通過這種方式,讀者就可以正確地過濾。公共汽車上的每個(gè)座位都插一個(gè)消息到隊(duì)列中。讀者就可以簡單地RECEIVE到所需的消息(在這個(gè)過程中,預(yù)定公共汽車上的座位)。 Service Broker會確保沒有消息會被接受兩次,也就是說你不會再遇到并發(fā)問題了。
2.SQL Server 2005中的索引類別
問:SQL Server 2005中是否有新的索引類別了?
解答: SQL Server 2005沒有為關(guān)系表引入新的索引類型。基本上——聚簇和非聚簇索引是以B-trees的方式實(shí)現(xiàn)的——還仍然在應(yīng)用。然而,SQL Server 2005確實(shí)包含了一些索引上的加強(qiáng),不論是完全文本索引,還是對于XML數(shù)據(jù),此外這些加強(qiáng)還可以改善一些與關(guān)系型索引有關(guān)的問題。
SQL Server 2005的完全文本索引特性是全新的,并且是重新編寫的。要獲得這個(gè)特性的信息,請閱讀Nimish Khanolkar的MSDN廣播文檔,介紹SQL Server 2005中的全文本查找。
XML是SQL Server 2005中另外一個(gè)在方式上發(fā)生了巨大轉(zhuǎn)變的內(nèi)容?,F(xiàn)在對于開發(fā)人員來說有第一流的XML數(shù)據(jù)類型可用了。這個(gè)類型支持XQuery查詢語言,使用了這個(gè)類型的字段可以通過特殊格式的XML索引被索引到。要了解更多有關(guān)XML類型的信息,請查找MSDN 上的文章。
還有各種各樣的有關(guān)T-SQL索引命令的加強(qiáng)。也許最令人感興趣的就是新的"在線"索引類型,它允許數(shù)據(jù)庫管理員在不需要把用戶鎖到表外面的情況下執(zhí)行索引維護(hù)任務(wù)。這個(gè)很有可能標(biāo)記著數(shù)據(jù)庫管理員需要等到夜里3點(diǎn)才能打開維護(hù)窗口修正問題的狀況的終結(jié)!
3.對于表和字段的常見名字約束
問:什么是常見的對表和字段的名字約束?
解答:SQL Server 2000下的表和字段名稱有1到128字節(jié)的限制,并且遵循用于標(biāo)識的規(guī)則。
第一個(gè)字母必須是如下的一種:
· Unicode Standard 2.0中規(guī)定的字母。
Unicode對字母的定義包括:拉丁字母,從A到Z,除了來自其他語言的字母之外。
· 下劃線(_),at符號(@),或者數(shù)字符號(#)
在SQL Server中以這些符號作為標(biāo)識符的開始具有特殊的含義。一個(gè)以at符號(@)開頭的標(biāo)識符表示一個(gè)本地的變量或者參數(shù)。一個(gè)以數(shù)字符號(#)開頭的標(biāo)識符代表一個(gè)臨時(shí)表或者過程。一個(gè)以兩個(gè)數(shù)字符號(##)開頭的標(biāo)識符標(biāo)識的是一個(gè)全局臨時(shí)對象。
一些Transact-SQL函數(shù)的名字以兩個(gè)at符號(@@)開頭。為了避免與這些函數(shù)混淆,推薦你不要使用兩個(gè)at符號(@@)開頭的標(biāo)識符。
接下來的字母可以是以下的任意幾種:
· Unicode Standard 2.0定義的字母
· 來自基礎(chǔ)拉丁文或者其他語音的十進(jìn)制數(shù)字
· at符號(@),美元符號($),數(shù)字符號(#),或者下劃線
標(biāo)識符絕對不能是Transact-SQL的保留字。SQL Server保留了一些大寫和小寫的保留字。內(nèi)建的空間或者特殊的字母都不允許出現(xiàn),盡管你可以在好的老版本的Northwind中看到它們包含了內(nèi)建的空間。你必須通過把它們括在括號中才可以訪問。
4.不具有任何T-SQL知識的情況下編寫SQL Server2005存儲過程
問:有沒有可能在不了解T-SQL的情況下編寫存儲過程? ]
解答:作為過去幾年里面微軟試圖用SQL Server 2005的.NET集成來稱霸市場的野心的結(jié)果,許多程序員都認(rèn)為創(chuàng)建SQL Server存儲過程不再必需T-SQL了。不幸的是(或者并非如此,這根據(jù)你的觀點(diǎn)),這并不全是事實(shí)。在技術(shù)上是可以在不了解T-SQL的情況下創(chuàng)建存儲過程的,但是沒有T-SQL的話則無法訪問任何的數(shù)據(jù)。
在CLR存儲過程內(nèi)部進(jìn)行數(shù)據(jù)訪問,是通過使用標(biāo)準(zhǔn)的ADO.NET類來完成的。開發(fā)人員會在應(yīng)用程序?qū)影l(fā)現(xiàn)很多同樣的沒有用處的數(shù)據(jù)訪問代碼,這些代碼會很輕易地轉(zhuǎn)移到SQLCLR例程中去。當(dāng)中間層的這些ADO.NET類需要使用T-SQL來訪問數(shù)據(jù)的時(shí)候,在 CLR主機(jī)提供的環(huán)境中就會使用同樣的類。
我要強(qiáng)調(diào)的是,從技術(shù)角度來說,不使用T-SQL來編寫存儲過程是可能的。那么有沒有理由這么做呢?一種情況就是這是一個(gè)用來從普通文件或者網(wǎng)絡(luò)服務(wù)中檢索數(shù)據(jù)的CLR存儲過程,并將數(shù)據(jù)格式設(shè)置為行集。這里可能就會用到不需要T-SQL的操作——但是這并不是對T -SQL存儲過程能力的一個(gè)很好的比喻。
關(guān)鍵詞標(biāo)簽:Microsoft SQL Server
相關(guān)閱讀
熱門文章 淺談JSP JDBC來連接SQL Server 2005的方法 SqlServer2005對現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表損壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構(gòu)的關(guān)系
人氣排行 配置和注冊O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫 SQL2000數(shù)據(jù)庫遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級到2000的正確操作步驟 sql server系統(tǒng)表損壞的解決方法 淺談JSP JDBC來連接SQL Server 2005的方法