一个用户登陆以后 在其他地方就不能再次使用该用户登陆 这个用什么思路啊(程序没有服务器,所以不能用线程监听) 最好是sql行加锁  其他的也可以, 谢绝在数据库中加一个字段标示登陆状态的弱智方案.
还有就是不同用户同时对一行数据进行修改删除 或者一个人作修改 一个人作删除操作 会出错(要是先删除了在修改) 或者同时修改 这个怎么解决呢?,怎么弄成一个用户操作该行数据时其他的用户就不能操作呢?SQL行加锁能解决的话应该怎么弄呢?思路代码都可以 最好是思路  分数不是问题 假若sql行加锁造成了死锁怎么进行解锁呢?用sql行加锁解决这个问题是否合理?

解决方案 »

  1.   

    SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能。用户既能使用SQL Server的缺省设置也可以在select 语句中使用“加锁选项”来实现预期的效果。本文介绍了SELECT语句中的各项“加锁选项”以及相应的功能说明。   功能说明:    NOLOCK(不加锁)   此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。   HOLDLOCK(保持锁)   此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。      UPDLOCK(修改锁)   此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。   TABLOCK(表锁)   此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。      PAGLOCK(页锁)   此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。      TABLOCKX(排它表锁)   此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。     使用这些选项将使系统忽略原先在SET语句设定的事务隔离级别(Transaction Isolation Level)。 请查阅SQL Server 联机手册获取更多信息。 例:select * from tablename where ... with(nolock)select * from tablename where ... with(holdlock)select * from tablename with (rowlock) where id=3 注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 
      

  2.   

    没服务器,。你哪来数据库?(数据存放XML,自定文件)
    神奇。。sql行加锁,用事务!(查询,不需用)
    写个公用 执行语法!!!
    如下:
     public int ExecuteBySQL(StringBuilder sql)
            {
                this.Open();
                SqlTransaction trans = this.connection.BeginTransaction();
                try
                {
                    SqlCommand cmd = new SqlCommand(sql.ToString(), this.connection);
                    cmd.CommandType = CommandType.Text;
                    cmd.Transaction = trans;
                    int intCount = cmd.ExecuteNonQuery(); 
                    trans.Commit();
                    return intCount;
                }
                catch (Exception e)
                {
                    trans.Rollback();
                    throw new SQLException(e.ToString());
                }
                finally
                {
                    this.Close();
                }
                
            }
      

  3.   

    真实的,我虽然不知道什么叫SQL加锁吧,但是我想你可以用这样的办法,在SQL登录用户表中写个约束,如果5分钟这个这个数据无写入更新等,变化,把标志写成空闲,然后才可以登录
      

  4.   

    通过事务操作,使用锁机制可以
    SELECT * FROM table1 WITH(ROWLOCK) WHERE ID= 1begin  tran 
    select * from table1 WITH(UPDLOCK, READPAST) where id = 1 
    waitfor  delay  '00:00:20'  
    commit  HOLDLOCK 持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别 
    NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别 
    PAGLOCK 在使用一个表锁的地方用多个页锁 
    READPAST 让sql server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁 
    ROWLOCK 强制使用行锁 
    TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表 
    UPLOCK 强制在读表时使用更新而不用共享锁 
    应用程序锁: 
    应用程序锁就是客户端代码生成的锁,而不是sql server本身生成的锁 
    处理应用程序锁的两个过程 
    sp_getapplock 锁定应用程序资源 
    sp_releaseapplock 为应用程序资源解锁 
    注意: 锁定数据库的一个表的区别 
    SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 
    SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 
      

  5.   

    恩  我再试试  个人感觉还是10楼的好 先不说麻烦不麻烦 至少用SQL行加锁作出来了 可以多学点东西 
    顺便请教下10楼的大虾  要是死锁了应该怎么处理呢?SQL会自己处理吗?希望还能赐教