当前位置:编程学习 > C#/ASP.NET >>

ADO.Net 如何给数据表加排它锁?

我的设计如果有人访问某新闻,代码从数据库中取出新闻浏览次数,加一,再写入
请问用ado.net如何给上述代码加排它锁保证任何时刻只有一个人在写入数据表 --------------------编程问答-------------------- 这个没必要吧,    不会有 同一时间 秒 有人访问的。

--------------------编程问答-------------------- 不是吧?网站访问量不小,可以不考虑这个因素? --------------------编程问答-------------------- up --------------------编程问答-------------------- 我的设计如果有人访问某新闻,代码从数据库中取出新闻浏览次数,加一,再写入
请问用ado.net如何给上述代码加排它锁保证任何时刻只有一个人在写入数据表

我觉得能不能不一次写,这样老连数据库不好
可以隔一个小时写一次嘛 --------------------编程问答-------------------- 我觉得能不能不一次写,这样老连数据库不好
可以隔一个小时写一次嘛

汗,这样怎么写?有思路吗?
刚才我查到好像sql server自动加锁 --------------------编程问答-------------------- // FOR MS SQL
using(SqlConnection conn = SqlConnection(MyConnectionString)) {  
   SqlCommand cmd1 = conn.CreateCommand();
   SqlCommand cmd2 = conn.CreateCommand();
   // cmd1.CommandText = ...
   // cmd2.CommandText = ...
   // ...
   conn.Open();
   using(SqlTransaction trans = conn.BeginTransaction(IsolationLevel.RepeatableRead)) { // 隔离级别:对读取的数据加锁,防止不可重复的读取,但是仍可以有幻像行
      cmd1.Trasnaction = trans;
      cmd2.Trasnaction = trans;
      try {
      // cmd1.ExecuteRead(); // 读取
      // ....
      // cmd2.ExecuteNonQuery();  // 更新
      trans.Commit(); // 提交
      } catch {
          trans.Rollback(); // 回滚
          throw;
      }
   }
}


--------------------编程问答-------------------- 你读取的时候那个时刻 顺便+1 就OK了,这个时间很小的,不会超过5ms  即便存在,几率也可以说得过去 --------------------编程问答-------------------- 其他隔离级别以及锁信息,请见:

IsolationLevel 枚举
指定连接的事务锁定行为。 
http://msdn2.microsoft.com/zh-cn/library/system.data.isolationlevel.aspx --------------------编程问答-------------------- 统计完全可以不放在数据库里面的,或者说定时放到数据库里面;这样的话你直需要锁程序就好了 --------------------编程问答-------------------- // Simplified Sample
// ->
using(SqlConnection conn = SqlConnection(MyConnectionString)) { 
SqlCommand cmd1 = conn.CreateCommand();
// cmd1.CommandText = "UPDATE NewsTable SET Hits = Hits + 1 WHERE NewsID = @NewsID";
conn.Open();
using(SqlTransaction trans = conn.BeginTransaction(IsolationLevel.RepeatableRead)) { // 隔离级别:对读取的数据加锁,防止不可重复的读取,但是仍可以有幻像行
cmd1.Trasnaction = trans;
try {
cmd1.ExecuteNonQuery(); // 更新
trans.Commit(); // 提交
} catch {
trans.Rollback(); // 回滚
throw;
}
}
} --------------------编程问答-------------------- 我是除了Select,其他操作都用事务,事务会加锁的
        以前用VB6的时候还有一些加不加锁的操作(比如adOpenForwardOnly, adLockReadOnly),.NET好像没看到有 --------------------编程问答-------------------- 你要通过ADO.NET给表加排他锁,那就用事务吧。你设置事务的隔离级别后,操作表的时候就给表加锁了。。上面有人给了 你方法了。 --------------------编程问答-------------------- 确实没必要  如果要真是这样数据库sql中有锁定  自己查下 --------------------编程问答-------------------- 如果用dataset做数据集的话,好像有这个功能。
不行的话,直接在数据库里面加锁吧。
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,