多人同時操作

takako_mu 2010-04-12 08:34:45
c# 多人同時操作需要用到什么技術啊?
...全文
150 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoulingsmile 2010-04-13
  • 打赏
  • 举报
回复
进来学习学习!帮你顶哈
takako_mu 2010-04-13
  • 打赏
  • 举报
回复
后台代码,使用lock后:

public class TestFactory
{
private static object objPONo = new object();

public static string GetPONumber(string name)
{
lock (objPONo)
{
//定義訂單號PONo
string PONo = string.Empty;

//將訂單號PONo自動加1
string strsql = "update tb set PONo=PONo+1,CreateBy='" + name + "',CreateDate=getdate()";
int i = SQLHelper.ExecuteNonQuery(strsql);

//如果登陸人為Takako,線程睡眠3秒.以作測試
if (name.ToLower() == "takako_yang")
{
Thread.Sleep(3000);
}

//如果update失敗,表示DB中不存在資料,則往DB塞入第一筆訂單號PONo:1000000000.
if (i == 0)
{
strsql = "insert into tb values(1000000000,'" + name + "',getdate())";
i = SQLHelper.ExecuteNonQuery(strsql);
}

//選出最后一筆
strsql = "select max(PONo) from tb";
object o = SQLHelper.ExecuteScalar(strsql);
if (o == DBNull.Value)
{
PONo = "1000000000";
}
else
{
PONo = SQLHelper.ExecuteScalar(strsql).ToString();
}
return PONo;
}
}
}


將DB中的資料刪光,delete tb
和上一個實驗一樣,甲按下甲頁面按鈕后,乙在1秒后也按下乙頁面按鈕.
結果如下:甲頁面在3秒后顯示了订单号PONo:1000000000;乙在3秒后顯示了訂單號PONo:1000000001。
這正是理想的結果。
takako_mu 2010-04-13
  • 打赏
  • 举报
回复
已解決.附實驗結果.
Table結構如下:

if object_id('tb') is not null drop table tb
create table tb(PONo nvarchar(10) ,CreateBy nvarchar(20) ,CreateDate smalldatetime)
go
select * from tb
go
--PONo CreateBy CreateDate
------------ -------------------- -----------------------
--(0 个数据列受到影响)


前臺代碼如下:

前台代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
string name = User.Identity.Name.ToString();
string PONo = TestFactory.GetPONumber(name);
Response.Write(PONo);
}


后臺代碼,未使用lock前:

public class TestFactory
{
private static object objPONo = new object();

public static string GetPONumber(string name)
{
//lock (objPONo)
//{
//定義訂單號PONo
string PONo = string.Empty;

//將訂單號PONo自動加1
string strsql = "update tb set PONo=PONo+1,CreateBy='" + name + "',CreateDate=getdate()";
int i = SQLHelper.ExecuteNonQuery(strsql);

//如果登陸人為Takako,線程睡眠3秒.以作測試
if (name.ToLower() == "takako_yang")
{
Thread.Sleep(3000);
}

//如果update失敗,表示DB中不存在資料,則往DB塞入第一筆訂單號PONo:1000000000.
if (i == 0)
{
strsql = "insert into tb values(1000000000,'" + name + "',getdate())";
i = SQLHelper.ExecuteNonQuery(strsql);
}

//選出最后一筆
strsql = "select max(PONo) from tb";
object o = SQLHelper.ExecuteScalar(strsql);
if (o == DBNull.Value)
{
PONo = "1000000000";
}
else
{
PONo = SQLHelper.ExecuteScalar(strsql).ToString();
}
return PONo;
//}
}
}

实验者路人甲、路人乙,在程序中添加了一段Thread.Sleep(3000),判断当实验者为甲时,睡眠3秒再继续后面的动作。
当甲按下甲页面上的按钮,乙在1秒后也按下乙页面上按钮;
这时乙页面会往DB塞一笔订单号PONo:1000000000;
3秒后,甲页面也会往系统塞一笔订单号PONo:1000000000;
很显然,出现了两笔一模一样的订单号,这不是我们想要的。
vip__888 2010-04-12
  • 打赏
  • 举报
回复
单例模式?
wjkhechen 2010-04-12
  • 打赏
  • 举报
回复
名称给你 vssourcesafe 2005
夺命胖子 2010-04-12
  • 打赏
  • 举报
回复
lock ....

锁定一代码,,同一时间只允许一个对象操作。。
duanjiwei 2010-04-12
  • 打赏
  • 举报
回复
线程。事物
xrongzhen 2010-04-12
  • 打赏
  • 举报
回复
帮顶吧 同时开发项目?还是什么。。。?
yaazz 2010-04-12
  • 打赏
  • 举报
回复
线程同步?
porschev 2010-04-12
  • 打赏
  • 举报
回复
多人同时操作数据库?..还是什么啊...
upc_xiaowei 2010-04-12
  • 打赏
  • 举报
回复
当仁不让了,虽然我不会

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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