2010-06-20 72 views
0

考虑一个具有连接到SqlDataSource的网格视图的网页,它具有插入更新和删除的所有权限。SQL Server 2005 Express实施了哪些锁定?

发布网页。

这一切都在一台计算机的本地

现在

  • 开放网站上的浏览器A - 按网格视图编辑
  • 开放网站上broswer乙 - 按网格视图的编辑。

现在我在这两种浏览器,然后按更新逐一细没有问题

最后更新是一种保留的编辑。

但假设情况:

  • 什么,如果有两台电脑,或
  • 如果我有两个鼠标指针由两个独立的小鼠

电脑有运行两个应用程序的能力控制同时

两个用户都准备好并同时在浏览器中按下更新

即使考虑两种不同的计算机上这是不可能的,但对于这个问题

认为这是从两个不同的源到同一数据库相同的表相同同一行

在可能

更新相同的时间,相同的秒数,相同的微秒无延时,同时打到数据库服务器。

会发生什么?

理论上我在研究数据库管理软件时写锁定时没有阅读,没有其他的写入等,但是SQL Server 2005 Express在实际中实现了锁定还是假设上面的情况永远不会发生?

如果锁有,请提供解释或资源这可以解释它同时考虑进入不同的场景

谢谢

编辑: - 我没有使用控制像SqlDataSource的,所以请当通过提供报表,以避免金光闪闪更新

其like--算法中---

sqlconnection conn=new ..... 
sqlcommand 
command text is "sql statement for updating values of a particular row" 
conn.Open(); 
cmd.ExecuteNonQuery(); 
conn.close; 

因此,如何看到如何在执行查询之前定义检查,如果数据最近发生更改,您确定要继续吗?或我有点困惑的东西在这里

我想.. }

回答

1

SQL 2005将强制锁。在更新行之前,交易必须获得排他锁。 Only 1 transaction can be granted this at a time,因此另一个必须等​​待该事务提交(2 phase locking)才能被授予更新所需的锁定。

第二次写入将会“胜利”,因为它会覆盖第一次写入。您可以在sqldatasource中实现optimistic concurrency controls以检测该行已更改并中止第二个,而不是盲目覆盖第一个编辑。

编辑

以下澄清的问题。如果你想自己推出,你可以在表中添加一个timestamp列(在SQL Server 2005中,当行更新时会自动更新),并将其作为隐藏数据项放入gridview中,然后在UPDATE语句中添加一个where子句UPDATE ... WHERE [email protected] AND [email protected]如果没有行受到影响(可从ExecuteNonQuery中检索 - generally),则另一个事务修改该行。这可能比数据源控件所使用的替代方案稍微轻巧一些,它将所有列的原始值传回,并使用类似的逻辑将它们添加到WHERE子句中。

+0

感谢,乐观....在advance中看到了这个选项...对于sqldatasource控件,但这里的问题是我没有使用它。请看看编辑和帮助谢谢你。我怎么能让这个“检查数据更改或没有更新之前” – user287745 2010-06-20 21:13:48

+0

@ user287745也许我误解了你的第一句话呢?我以为你在谈论sqldatasource控件? – 2010-06-20 21:17:22

+0

没有不使用此控件,显示结果在gridview我的sqlreader,并要求用户在文本框中输入新值,然后执行更新语句,原油的方式,但必须学习SQL语句没有关于它的控制:-(所以我想什么我问的是有没有办法在更新查询执行之前检测特定表的数据库行中的更改 – user287745 2010-06-20 21:25:08

2

这是大多数应用程序使用Optimistic Concurency control解决。应用程序只是将更多条件添加到更新WHERE子句中,以检测数据读取和更新应用之间发生的更改。被称为乐观协调,因为应用程序假定不会发生协同变化,如果它们确实发生,它们会被检测到,并且appplicaiton必须重新启动操作。乐观协调的替代方案是应用程序显式锁定其计划更新的数据的仿冒协调性。在实践中涉及用户交互的操作是从不在新教协调模型下完成。

Fiefdom and Emissaries模型暗示了其他协调模型,特别是在分布式应用程序中。

因此,尽管数据库锁和事务协调模型在任何数据库操作中都是无所不在的,但当涉及用户交互时,应用程序永远不会依赖数据库锁。就数据库事务而言,用户交互只是一种很长的方式。为健忘的Fred获取锁定午餐时间,并在桌面上打开数据屏幕根本不起作用。