怎么控制好数据库的并发

cer 2003-09-29 06:05:48
在sql server或Accsee中怎样控制好数据库的并发,如果用xml存数据又怎样控制呢?比如在csdn中发的帖子,在一个人回帖时另一个也回了帖那又怎样处理?希望高手谈谈想法,希望板主制顶
...全文
60 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lufly2000 2004-02-29
  • 打赏
  • 举报
回复
因为数据结构基于断开的数据,所以 ADO.NET 和 Visual Studio .NET 使用开放式并发。因此,您需要添加业务逻辑,以利用开放式并发解决问题。

如果您选择使用开放式并发,则可以通过两种常规的方法来确定是否已发生更改:版本方法(实际版本号或日期时间戳)和保存所有值方法。




测试是否存在开放式并发冲突
测试是否存在开放式并发冲突的方法有若干种。其中一种涉及到在表中包含时间戳列。数据库通常会提供时间戳功能,该功能可用于标识记录最后更新的日期和时间。当使用这种方法时,将在表定义中包含时间戳列。每当更新记录时,时间戳都将得到更新,以反映当前的日期和时间。在测试是否存在开放式并发冲突时,对表内容的任何查询都会返回时间戳列。当试图执行更新时,数据库中的时间戳值将与所修改行中包含的初始时间戳值进行比较。如果两者匹配,则会执行更新,并用当前时间更新时间戳列以反映更新。如果两者不匹配,则发生了开放式并发冲突。

测试是否存在开放式并发冲突的另一种方法是验证某行中的所有初始列值是否仍匹配数据库中的相应值。例如,考虑以下查询:

SELECT Col1, Col2, Col3 FROM Table1

若要在更新 Table1 中的某行时测试是否存在开放式并发冲突,请发出以下 UPDATE 语句:

UPDATE Table1 Set Col1 = @NewCol1Value,
Set Col2 = @NewCol2Value,
Set Col3 = @NewCol3Value
WHERE Col1 = @OldCol1Value AND
Col2 = @OldCol2Value AND
Col3 = @OldCol3Value

只要初始值匹配数据库中的值,就会执行更新。如果已修改某个值,由于 WHERE 子句找不到匹配项,更新将不会修改该行。

请注意,建议始终在查询中返回唯一的主键值。否则,以上 UPDATE 语句会更新多个行,这可能会有悖于您的意图。

如果数据源中的列允许空值,则可能需要扩展 WHERE 子句,以查找本地表和数据源中的匹配空引用。例如,以下 UPDATE 语句验证本地行中的空引用仍匹配数据源中的空引用,或者本地行中的值匹配数据源中的值。

UPDATE Table1 Set Col1 = @NewVal1
WHERE (@OldVal1 IS NULL AND Col1 IS NULL) OR Col1 = @OldVal1

当使用开放式并发模型时,也可以选择应用限制较少的条件。例如,如果只在 WHERE 子句中使用主键列,那么无论自最后一次查询以来是否已更新其他列,数据都将被改写。也可以只将 WHERE 子句应用于特定列,除非自最后一次查询特定字段以来已将其更新,否则数据也会被改写。
cm8983 2004-01-10
  • 打赏
  • 举报
回复
up
wishen 2004-01-10
  • 打赏
  • 举报
回复
up
haipin 2004-01-10
  • 打赏
  • 举报
回复
http://www.microsoft.com/china/msdn/library/dv_vstechart/html/vbdatasetconflicts.asp
kuangsha007 2003-09-30
  • 打赏
  • 举报
回复
ADO.NET 提供了一个 DBConcurrencyException 对象来帮助解决并发冲突所引发的问题。DBConcurrencyException 对象返回导致错误的数据行。有关更多信息,请参见 DBConcurrencyException 成员。
下面的示例试图在 Try... Catch 块中用 myDataset 的内容更新数据源,如果引发了错误,则显示错误信息以及有问题数据行的第一列。
注意 下面的代码举例说明了一种处理数据库更新错误的策略。该代码假定了以下内容:一个与数据库的现有连接、一个名为 myDataset 的现有数据库,以及更新命令的执行将引发并发冲突的假设。有关更多信息和完整的示例,请参见演练:处理并发异常。
解决并发冲突
执行用于在 Try...Catch 块中更新数据库的命令。
如果引发异常,则检查 Catch 语句的 Row 属性,以确定导致冲突的原因。
根据您的应用程序业务规则添加代码来解决错误。
下面的代码将 SqlDataAdapter1 和 myDataset 用作应用程序中数据适配器和数据集的示例。
' Visual Basic
Try
SqlDataAdapter1.Update(myDataset)
Catch ex As DBConcurrencyException
Dim customErrorMessage As String
customErrorMessage = "Concurrency violation" & vbCrLf
customErrorMessage += Ctype(ex.Row.Item(0), String)
MessageBox.Show(customErrorMessage)
' Replace the above code with appropriate business logic
' to resolve the concurrency violation.
End Try

// C#
try
{
SqlDataAdapter1.Update(myDataset);
}
catch (DBConcurrencyException ex)
{
string customErrorMessage;
customErrorMessage = "Concurrency violation\n";
customErrorMessage += ex.Row[0].ToString();
// Replace the above code with appropriate business logic
// to resolve the concurrency violation.
}
saucer 2003-09-30
  • 打赏
  • 举报
回复
for concurrency problems, see

Tackle Data Concurrency Exceptions Using the DataSet Object
http://msdn.microsoft.com/msdnmag/issues/03/04/DataConcurrency/default.aspx
saucer 2003-09-30
  • 打赏
  • 举报
回复
>>>怎样判断一个XML文件正在使用呢???

centralize the code to access the xml in some shared method and use lock (C#) or SynLock (VB.NET) to synchronize the access
cer 2003-09-30
  • 打赏
  • 举报
回复
怎样判断一个XML文件正在使用呢???
ahui_net 2003-09-29
  • 打赏
  • 举报
回复
在一个人回帖时另一个也回了帖那又怎样处理
这些不用你来考虑,数据库已经帮你做了

当改变一条数据的时候
数据库就把他琐上了
等你修改完
再打开

如果存成xml文件,你就需要自己判断
否则会告诉你,该文件正在使用中

62,025

社区成员

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

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

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

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