1.当ABCD四个人同时访问数据库同一条记录时,假如A最早访问,如何做到A可以对该条记录进行所有操作,BCD只读,而不能进行任何其他操作?
2.有张“登陆登出日志”表,包括3个字段(用户,登陆时间,登出时间),在登陆系统时记录登陆时间,登出时记录等登出时间,假如异常退出,比如死机、断电等,这时该如何处理?
3.当一条记录Update时,如何将该条记录所有被修改的字段保存到一张表‘记录日志’(没修改的不用)?

解决方案 »

  1.   

    1,启用事务
    2,采用定时更新退出时间
    3,建一个结构一样的bak表,但要比原表多一个ID,更新之前,把数据复制过去就行了 可以考虑触发器
      

  2.   

    1.DataSet数据集,断开连接的操作,事务是肯定不行了。
    2.假如我进行了一个操作,但定时器时间没到,异常退出,则无法更新。
    3.注:是把每个修改了的字段保存到bak表,而非整条记录。
      

  3.   

    1,SELECT * FROM table WITH (HOLDLOCK) 会话A持有共享锁,BCD可以select不能update,当A释放后BCD才可以update。
    2,心跳机制,定时获取客户端状态,关键部分用。
    3,用触发器。
      

  4.   

    断开连接的话可以参考这个文章,独占查询模拟,用update当select,后面的会话根据是否有tag标记来判断是否可以update
    http://blog.csdn.net/jinjazz/article/details/4520802
      

  5.   


    这个是数据库应该考虑的问题,而不你来考虑的,1. 可以参考一下,数据库的隔离级别,不过默认的数据库隔离级别就是这样的,因此你不需要做任何的处理就可以实现,也不用加什么事务
    2. 不明白你说什么,客户没登出就死机,还是服务器死机,客户端死机的话,可以在服务端这样处理,登陆时就写登陆日志,退出之后再写登出时间,如果客户机死机,可以设定一个超时时间,超时时间过了之后,把没有动作的客户机全部登出,并记录该客户机登出时间,如果是服务端死机,那就不管了,有什么好弄的。
    3. Update数据的同时,再写一下日志表。
      

  6.   

    Linux7985
    undead4444
    你们貌似说的对 再看看 如果别人说的没你们的合理就给你们
      

  7.   

    SQL中经常被人忽略的:锁!排他锁可以解决楼主所讲的问题1
    事务是确保数据的原子性和一致性
      

  8.   

    5楼已经回答的很完整了我在补充一下第3个问题
    对于第3个问题,一般有2种方式完成
    第一种数据库方式:数据库做update触发,然后更新日志(其实sql的日志本身也有这功能,假设你很清楚sql日志的格式,完全也可以直接分析sql日志)第二种方式,由自己的代码完成。自己的对象实现INotifyProptyChanged,IEditableObject 两个事件。由这两个接口共同完整,属性修改判定(IEditableObject会把原始值保存,INotifyProptyChanged则可以在修改属性值的时候和原始值比较一下,如果的确是修改了则向上触发通知)这样你就可以在EndEidt的时候,获取到整个对象都修改了那些属性值的消息,然后保存下来