none
sql server获取数据处理方法的设计问题 RRS feed

  • 问题

  • 场景:  .net app 读取数据库后得到一组数据,如班级的每个学生信息,显示出来。然后每个用户可以点击某个记录来编辑某个学生信息,然后保存。 数据量不是很大,记录300 多条最多。但是存在一些并发的用户。

    设计方法1: 。net 一次读取所有相关数据,保存到dataset ,然后显示出来,编辑后更新dataset,然后更新到数据库。 这种方法避免和数据库频繁交互,只取一次数据。 问题:如果dataset 被一个用户A更新,而其他的用户B已经显示dataset 到客户端(在查看或者编辑数据阶段) ,那么B 编辑保存时能否得知dataset 已经更新?如何处理此冲突?

    方法2:  。net 一次读取所有相关数据,然后显示出来,每个用户点击某个记录来编辑某个学生信息时,重新读取数据库得到最新数据,然后编辑并保存后更新到数据库。优点:实时性强, 缺点: 每条数据都要重新读取数据库,消耗是否大?

    请帮忙解答一下,另外还有没有其他更优化的方案,谢谢!

    2011年2月26日 1:57

全部回复

  • 可以在每行中引入一個timestamp(時間戳)列來保證衝突檢測,更新時使用學生ID+時間戳為條件,如沒有行被更新則認為需要重新從DB中抓取該行數據.

    另:

    你說的兩種方法都無法保證數據不會衝突,因為一行記錄有可能兩個人同時去讀取,除非犧牲點性能讀取時就(holdlock + uplock)該記錄.

    2011年2月26日 3:27
  • 这个timestamp 是个GUID 之类的值吧? 是否需要在数据库表中加此timestamp列?
    2011年2月26日 8:30
  • Datetime column should be ok.
    2011年2月26日 14:19
  • 一个开发人员还有个方案

    dataset 得到数据后,如果有某个客户更新了,程序会更新dataset 以及所有客户端的cache,来保持客户端最新。 因为目前只有一个应用update 这些表,这个方案是否可行?

    谢谢

    2011年2月28日 13:00
  • 一个开发人员还有个方案dataset 得到数据后,如果有某个客户更新了,程序会更新dataset 以及所有客户端的cache,来保持客户端最新。 因为目前只有一个应用update 这些表,这个方案是否可行?

    2011年3月3日 2:18