一个用户登陆以后 在其他地方就不能再次使用该用户登陆 这个用什么思路啊(程序没有服务器,所以不能用线程监听) 最好是sql行加锁 其他的也可以, 谢绝在数据库中加一个字段标示登陆状态的弱智方案.
还有就是不同用户同时对一行数据进行修改删除 或者一个人作修改 一个人作删除操作 会出错(要是先删除了在修改) 或者同时修改 这个怎么解决呢?,怎么弄成一个用户操作该行数据时其他的用户就不能操作呢?SQL行加锁能解决的话应该怎么弄呢?思路代码都可以 最好是思路 分数不是问题 假若sql行加锁造成了死锁怎么进行解锁呢?用sql行加锁解决这个问题是否合理?
还有就是不同用户同时对一行数据进行修改删除 或者一个人作修改 一个人作删除操作 会出错(要是先删除了在修改) 或者同时修改 这个怎么解决呢?,怎么弄成一个用户操作该行数据时其他的用户就不能操作呢?SQL行加锁能解决的话应该怎么弄呢?思路代码都可以 最好是思路 分数不是问题 假若sql行加锁造成了死锁怎么进行解锁呢?用sql行加锁解决这个问题是否合理?
神奇。。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();
}
}
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) 其他事务不能读取表,更新和删除
顺便请教下10楼的大虾 要是死锁了应该怎么处理呢?SQL会自己处理吗?希望还能赐教