如果在程序中需要创建全局唯一的序号,那么必须对创建序号的过程进行同步处理,防止多个并发访问时出现相同序号的情况。下面列出几种方法供大家参考。 利用数据库的方法 后面的例子都基于MS SQL Server,如果使用Oracle可以直接读取Sequence对象,则不需要进行如此复杂的操作。 方法1:利用表锁定 表结构:create table xtab (seq_id int primary key, create_time datetime) 存储过程或SQL语句:
方法2:利用自增字段 如果利用自增变量可以通过方法1中锁定表,然后再插入记录,并读取最大值的方法。不过下面讲的是通过C#的ADO.NET来插入记录,并读取已经插入的记录的自增字段。 表结构:create table xtab_i (seq_id int IDENTITY(1,1) primary key, create_time datetime) C#代码,利用时间处理函数在数据被更新时同时读取@@IDENTITY变量的值。完整内容参考:OleDbWrap.cs 文件。
利用程序控制 方法1:利用ASP.NET中的Application对象 利用ASP.NET中的全局HttpApplicationState对象。 C#代码:
方法2:利用操作系统中的同步对象来实现同步 在dotNet的框架的System.Threading命名空间下定义了多种用于同步的类,例如:Mutex,Semaphore。下面介绍一下利用互斥对象Mutex来实现同步的方法。 C#代码:
在程序中应该尽量使用Mutex这类可以命名的同步对象以达到创建多个同步对象,对多种资源进行同步的目的。如果要实现多个同入可以使用信号量 Semaphore。 其他方法:利用lock关键字防止线程并发同一段代码执行 C#代码:
由于ASP.NET程序在IIS中可能配置不同的线程模式,所以在ASP.NET程序尽可能不要使用这种方法同步线程,而在普通的应用程序中是可以使用这种方法。
Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved. 闵涛 E_mail:admin@mintao.net(欢迎提供学习资源)
鄂公网安备 42011102001154号
站长:MinTao ICP备案号:鄂ICP备11006601号-18