應用程序的各個部分均使用相同的順序訪問表。 在每個表上使用聚集索引,來實施顯式行排序。 使事務保持簡短。 有關具體信息,請參見 Microsoft Knowledge Base 文章:Detecting and Avoiding Deadlocks in Microsoft SQL Server(Microsoft SQL Server 死鎖的檢測和避免)。
在 Oracle 中,要執行遠程事務,必須能夠使用數據庫鏈接,來訪問遠程數據庫節點。在 SQL Server 中,則必須能夠訪問一個“遠程服務器”。遠程服務器是在網絡上運行 SQL Server 的一個服務器,用戶可使用本地服務器對它進行訪問。當一個服務器被設置為遠程服務器時,用戶無須顯式登錄,就可以使用其上的系統過程和存儲過程。
遠程服務器是成對設置的。必須對兩個服務器進行配置,使之均將對方作為遠程服務器。必須使用 sp_addlinkedserver 系統存儲過程或 SQL Server EnterPRise Manager,把每個服務器的名稱加入它的伙伴名稱中。
設置遠程服務器之后,使用 sp_addremotelogin 系統存儲過程或 SQL Server Enterprise Manager,為必須訪問遠程服務器的用戶設定遠程登錄 ID。這一步完成之后,必須授予此執行存儲過程的權限。
DECLARE @retvalue1 int EXECUTE @retvalue = STUDSVR1.student_db.student_admin.validate_student '111111111'
有關具體信息,請參見 SQL Server Books Online。
假如在兩個或多個網絡數據庫節點上對表進行更改,Oracle 就會自動啟動一個分布式事務。SQL Server 分布式事務則使用包含在 SQL Server 中的 Microsoft 分布式事務處理協調器 (MS DTC) 的兩階段提交服務。
默認情況下,必須指示 SQL Server 參與分布式事務。可以使用以下方法之一,使 SQL Server 開始參與 MS DTC 事務:
使用 BEGIN DISTRIBUTED TRANSACTION 語句。這個語句開始一個新的 MS DTC 事務。 使用直接調用 DTC 事務接口的客戶應用程序。 在此例中,請注重對本地表 GRADE 和遠程表 CLASS(使用 class_name 過程)的分布式更新:
BEGIN DISTRIBUTED TRANSACTION UPDATE STUDENT_ADMIN.GRADE SET GRADE = 'B+' WHERE SSN = '111111111' AND CCODE = '1234' DECLARE @retvalue1 int EXECUTE @retvalue1 = CLASS_SVR1.dept_db.dept_admin.class_name '1234', 'Basketweaving' COMMIT TRANSACTION GO
假如應用程序不能完成此事務,應用程序就會使用 ROLLBACK TRANSACTION 語句取消它。假如應用程序失敗或參與的資源治理器失敗,MS DTC 就會取消此事務。MS DTC 不支持分布式保存點或 SAVE TRANSACTION 語句。假如一個 MS DTC 事務終止或回滾,整個事務被回滾到分布式事務的起始處,無論有多少個保存點都是如此。
Oracle 和 MS DTC 兩階段提交機制在操作上是類似的。在 SQL Server 兩階段提交的第一階段中,事務治理器請求每個參加的資源治理器為提交做預備。假如任何資源治理器不能預備,則事務治理器向事務所涉及的每個人廣播終止決定。
在 SQL Server 中,此語句只能由表的所有者執行。在 Oracle 中,假如是表的所有者或擁有 DELETE TABLE 系統權限,就可以執行此命令。
Oracle TRUNCATE TABLE 命令可以有選擇地釋放表中行所占用的存儲空間。SQL Server TRUNCATE TABLE 語句總是收回表數據及其相關索引所占用的空間。
標識符列和時間戳列中數據的處理 Oracle 序列是與任何給定的表或列均不直接相關的數據庫對象。列和序列之間的關系是在應用程序中實現的,即通過編程的方法將序列值賦給列。因此,Oracle 使用序列時,并不實施任何規則。但是,在 Microsoft SQL Server 標識符列中,值不能被更新,并且不能使用 DEFAULT 要害字。
默認情況下,數據不能直接插入到標識符列。標識符列自動給表中插入的每個新行生成一個唯一的序列號。可以使用下列 SET 語句改寫這種默認設置: