问题是两个进程可以并发的读取免费票的数量,并都可以保留一张票,即使已经没有免费票了。我需要一种方法使运行add_ticket存储过程的进程在没有插入一张新的票之前,其它进程被阻止读取免费票的数量。SET TRANSACTION ISOLATION LEVEL在这种情况下不起作用,对吧?
你是对的;一个更高的隔离级别不能帮助保证多个读者不会同时读取同一行数据。不过,你可以采取几种方式来完成这个工作。例如,你可以分配给每一个座位一个唯一的标识(意思是,一个唯一的键,没有必要是全局统一标识符),并创建一个表储存已经被占用的座位。在这个表上加一个UNIQUE约束,这样就能保证一个座位不能插入两次。
我认为一个更有趣的选择可能是使用SQL Service Broker。你可以为每一辆公交车建立一个会话,将这个会话句柄存储在一个表里,读者在作接受之前可以参考这个表。通过这种方法,读者可以简单的按其需要接受这个信息(在进程中,保留汽车上的座位)。Service Broker会确保没有信息会被接受两次,这意味着你不会再碰到任何并发问题。
—Adam Machanic,SQL Server 2005专家
12. SQL Server 2005数据库可以移植回SQL Server 2000吗?
在移植到SQL Server 2005的过程中,许多组织仍然会被要求支持SQL Server 2000安装。结果,一个普遍的要求是能够反向移植:将数据库从SQL Server 2005移植会SQL Server 2000。
不幸的是,这并不是那么简单。从SQL Server 2005实例备份的数据库不能恢复到SQL Server 2000实例中。分离的SQL Server 2005数据库也不能重新绑定到SQL Server 2000中。
因为不支持备份/恢复和分离/绑定,对于移动数据从SQL Server 2005到SQL Server 2000的唯一可用的方法是基于复制数据。数据和schemas可以用一个工具例如Red Gate的SQL Packager来跟踪,脚本可以应用于SQL Server 2000上。另一个选择是使用像DTS或SSIS之类的工具,这些工具都包含数据复制向导。
然而,复制数据和schema是一个潜在的麻烦经历。SQL Server 2005支持许多SQL Server 2000种没有的特性,而这在交叉移植过程中会引起问题。在试图为两种平台开发解决方案时谨慎是很重要的,我的建议是开发应该采用SQL Server 2000来完成,而代码和数据应该移植到SQL Server 2005中。
—Adam Machanic,SQL Server 2005专家
评论加载中…
![]() |