应用程序的各个部分均使用相同的顺序访问表。 在每个表上使用聚集索引,来实施显式行排序。 使事务保持简短。 有关具体信息,请参见 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 语句改写这种默认设置: