C#lock问题

ranlei 2009-03-25 11:26:13
当我在操作数据表的时候怎样使用lock来锁定表,望各位给各位实际例子(数据库是sql2005)开发工具vs2005
...全文
110 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pricks 2009-03-25
  • 打赏
  • 举报
回复
很简单:
先在外面声明一个锁:
object lockThis=new Object();
然后就可以使用这把锁进行锁定了:

private int chg_ID()
{
lock(lockThis)
{
SqlDBOperator sql = new SqlDBOperator(conStr);
int QW1 = 0;
int QW2 = 0;
string st1 = "Select max(chg_id) from a_charge";
DataTable dt1 = new DataTable();
dt1 = sql.GetDataTable(st1);
QW1 = (int)dt1.Rows[0][0];
string st2 = "Select count(chg_id) from a_charge where chg_id = "+QW1+"";
DataTable dt2 = new DataTable();
dt2 = sql.GetDataTable(st2);
QW2 = (int)dt2.Rows[0][0];
if (QW2 > 1)
{
QW1++;
}
return QW1;
}
}
phommy 2009-03-25
  • 打赏
  • 举报
回复
用 Serializable 级别的事务

    // Summary:
// 指定连接的事务锁定行为。
public enum IsolationLevel
{
// Summary:
// 正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。
Unspecified = -1,
//
// Summary:
// 无法改写隔离级别更高的事务中的挂起的更改。
Chaos = 16,
//
// Summary:
// 可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。
ReadUncommitted = 256,
//
// Summary:
// 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。
ReadCommitted = 4096,
//
// Summary:
// 在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。
RepeatableRead = 65536,
//
// Summary:
// 在 System.Data.DataSet 上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。
Serializable = 1048576,
//
// Summary:
// 通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。
Snapshot = 16777216,
}
m777 2009-03-25
  • 打赏
  • 举报
回复
建议不要使用取最大值的方法,给数据库加锁估计会把你自己锁住!

建议使用自增长整形ID,SQL 语句Insert执行后,通过 select @@IDENTITY 这个变量可以返回刚才Insert所生成的ID的值!

解答完毕
ranlei 2009-03-25
  • 打赏
  • 举报
回复
是这样子的,我在数据表里面有一个ID主键,我写了一个方法来生成ID,生成的ID遵循1,1,2,2,3,3,4,4.......这样的规则。实现方法的代码:
private int chg_ID()
{
SqlDBOperator sql = new SqlDBOperator(conStr);
int QW1 = 0;
int QW2 = 0;
string st1 = "Select max(chg_id) from a_charge";
DataTable dt1 = new DataTable();
dt1 = sql.GetDataTable(st1);
QW1 = (int)dt1.Rows[0][0];
string st2 = "Select count(chg_id) from a_charge where chg_id = "+QW1+"";
DataTable dt2 = new DataTable();
dt2 = sql.GetDataTable(st2);
QW2 = (int)dt2.Rows[0][0];
if (QW2 > 1)
{
QW1++;
}
也就是说我要先找出数据表里面的id最大值,如果我有多个用户的话,很有可能A用户在查询最大值后B用户又添加了一条数据,那么最大值就变了,当A利用查询出的最大值ID(主键)为基础再加上1(及max(id)+1)做主键时就会出错,因为这个时候的最大ID已经变成了B用户刚插入的那一条数据的ID及max(id)+1
// return QW1;
//}
sjt000 2009-03-25
  • 打赏
  • 举报
回复
操做单表的话,不用你考虑锁,数据库自动加锁的
多表操作用事务。
devrauber 2009-03-25
  • 打赏
  • 举报
回复
事务
http://topic.csdn.net/t/20040514/10/3066228.html
ranlei 2009-03-25
  • 打赏
  • 举报
回复
谢谢你们了,我把分数各谁呢,我还是送给“一年一年这样过”吧,但我再次谢谢其他人

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧