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