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