1.SQL Server 2005中的存儲過程並發問題
問:我在SQL Server2005中遇到了並發問題。我持有車票的公共汽車上有一些空閒的座位。我在插入銷售的查票之前,需要查看是否還有空閒的座位。我的存儲過程做的事情如下所示:
以下為引用的內容:
CREATE PROCEDURE add_ticket — parameters
DECLARE free_seats int BEGIN
TRANSACTION SELECT free_seats
= COUNT(*) FROM tickets WHERE
seat_is_not_taken IF free_seats
<> 0 INSERT INTO tickets VALUES(…)
— some other statements END TRANSACTION
問題就是兩個過程可以同時讀取空閒票數,並且都可以預約一張票,即使是那裡已經沒有空余的了。我需要一種方法來防止一個過程在另一個過程運行add_ticket程序,但是還沒有插入一張新票的時候讀取空票的數量。
解答: 你是正確的;更高的隔離級別也不會保證多個讀者去同時去讀取同一個數據行。然而,還有幾種方法你可以完成這項工作。例如,你可以給每個座位分配一個惟一的標識符(意思是,惟一鍵——不一定是GUID),並且創建一個描述哪些座位已經被預訂了的表。在表上放一個 UNIQUE約束,你就可以確保同一個座位不會被插入兩次了。
就是說,我認為一個更有趣的方法就是使用SQL Service Broker。你可以為每個公交建立一個會話,並且將這個會話的句柄存放在一個表中,讀者在執行RECEIVE之前可以參考這個表。通過這種方式,讀者就可以正確地過濾。公共汽車上的每個座位都插一個消息到隊列中。讀者就可以簡單地RECEIVE到所需的消息(在這個過程中,預定公共汽車上的座位)。 Service Broker會確保沒有消息會被接受兩次,也就是說你不會再遇到並發問題了。
2.SQL Server 2005中的索引類別
問:SQL Server 2005中是否有新的索引類別了?
解答: SQL Server 2005沒有為關系表引入新的索引類型。基本上——聚簇和非聚簇索引是以B-trees的方式實現的——還仍然在應用。然而,SQL Server 2005確實包含了一些索引上的加強,不論是完全文本索引,還是對於XML數據,此外這些加強還可以改善一些與關系型索引有關的問題。
SQL Server 2005的完全文本索引特性是全新的,並且是重新編寫的。要獲得這個特性的信息,請閱讀Nimish Khanolkar的MSDN廣播文檔,介紹SQL Server 2005中的全文本查找。
XML是SQL Server 2005中另外一個在方式上發生了巨大轉變的內容。現在對於開發人員來說有第一流的XML數據類型可用了。這個類型支持XQuery查詢語言,使用了這個類型的字段可以通過特殊格式的XML索引被索引到。要了解更多有關XML類型的信息,請查找MSDN 上的文章。
還有各種各樣的有關T-SQL索引命令的加強。也許最令人感興趣的就是新的“在線”索引類型,它允許數據庫管理員在不需要把用戶鎖到表外面的情況下執行索引維護任務。這個很有可能標記著數據庫管理員需要等到夜裡3點才能打開維護窗口修正問題的狀況的終結!
3.對於表和字段的常見名字約束
問:什麼是常見的對表和字段的名字約束?
解答:SQL Server 2000下的表和字段名稱有1到128字節的限制,並且遵循用於標識的規則。
第一個字母必須是如下的一種:
· Unicode Standard 2.0中規定的字母。
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集成來稱霸市場的野心的結果,許多程序員都認為創建SQL Server存儲過程不再必需T-SQL了。不幸的是(或者並非如此,這根據你的觀點),這並不全是事實。在技術上是可以在不了解T-SQL的情況下創建存儲過程的,但是沒有T-SQL的話則無法訪問任何的數據。
在CLR存儲過程內部進行數據訪問,是通過使用標准的ADO.NET類來完成的。開發人員會在應用程序層發現很多同樣的沒有用處的數據訪問代碼,這些代碼會很輕易地轉移到SQLCLR例程中去。當中間層的這些ADO.Net類需要使用T-SQL來訪問數據的時候,在 CLR主機提供的環境中就會使用同樣的類。
我要強調的是,從技術角度來說,不使用T-SQL來編寫存儲過程是可能的。那麼有沒有理由這麼做呢?一種情況就是這是一個用來從普通文件或者網絡服務中檢索數據的CLR存儲過程,並將數據格式設置為行集。這裡可能就會用到不需要T-SQL的操作——但是這並不是對T -SQL存儲過程能力的一個很好的比喻。