`
lxdhdgss
  • 浏览: 45248 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

对面向对象的一点疑问,百思不得其解

    博客分类:
  • JAVA
阅读更多
学JAVA已经有五年了,当然,我现在已经不是一个职业程序员,但一直还是把JAVA当作自己的一项技能,时时用之。但是关于面向对象设计上有个问题一直弄不懂,特别是用HIBERNATE来做数据库操作时。所以向大家讨教。
问题是这样的:比如一个User类,记载了一个用户的信息,如姓名、年龄、性别等等。
假设有两个管理员同一时间段对某一个用户的资料进行修改,而且只改资料里面的某一项,其他项和进入修改页面时从数据库里读出来的一样。那么
1.A、B管理员都打开该用户的资料修改页面,这个时候,A、B管理员面前的修改页面是数据都是一样的。
2.A管理员改了“年龄”,B管理员“地址”。
3.A管理员保存更新,“年龄”这一项改变了,其他项和数据库里取出时一样。
4.B管理员也保存更新,“地址”这一项改变了,其他项和数据库里取出时一样。
这样的问题是,A管理员更新的“年龄”被B管理员的更新冲掉了,变成了原来的年龄

这个问题在一些企业应用中还是经常会碰到的,特别是那些需要多人协同,负责采集一个对象的数据的情况。
我在GOOGLE里面也试过,修改自己的Gmail帐号信息,可是还是出现了数据被冲掉的现象。
我现在对这些问题都是采用JDBC直接进行单字段的set XX = ?来解决,但是这样就不是OOD了。
也许对大家来说早就不是问题了,所以想向大家请教!
0
0
分享到:
评论
7 楼 lxdhdgss 2009-05-19  
king_108 写道

一般做法,USER 表加个 最后修改时间 和REVISION 字段,UPDATE 的时候判断 读出这2个字段的版本是否跟DB的版本一致,才允许更新操作

你这个做法很好啊!觉得比较可行。其他的几个回答,我觉得可能是没有明白我的意思吧。我觉得大家可以去试试修改邮箱的个人信息,打开两个浏览器,更改不同的地方,如一个浏览器改地址,一个改联系电话,然后保存,再打开看看是不是地址和联系电话都被修改了,还是一个和原来是一样的。
6 楼 king_108 2009-05-19  
一般做法,USER 表加个 最后修改时间 和REVISION 字段,UPDATE 的时候判断 读出这2个字段的版本是否跟DB的版本一致,才允许更新操作
5 楼 lxdhdgss 2009-05-19  
平时自己还有生意要做,JAVA只是凭兴趣,在大学的时候写这个的!
4 楼 seekgirl 2009-05-19  
5年还没搞懂?令人惊讶
3 楼 tongjian 2009-05-19  
tongjian 写道

这是数据库里的脏读取。在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。 ●   未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。 ●   授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。 ●   可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。 ●   序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。        隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。 详情参加:http://genghaixu.iteye.com/blog/300567 楼主搞java5年,竟然被这个问题困扰这么久,数据库知识也很重要啊。   

更正,问题应该是Second lost updates problem。可以用乐观锁或悲观锁来解决。
2 楼 tongjian 2009-05-19  
这是数据库里的脏读取。在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
●   未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
●   授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
●   可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
●   序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
       隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

详情参加:http://genghaixu.iteye.com/blog/300567

楼主搞java5年,竟然被这个问题困扰这么久,数据库知识也很重要啊。
   
1 楼 Saito 2009-05-18  
对这个User加锁呢?

          同时间段只能一个人修改就行了?

相关推荐

    面向对象分析与设计UML2.0(PDF)

    本书使用最常见的技术和方法,通过一个贯穿全书的案例分析,对面向对象的软件开发过程和使用面向对象技术的编程过程进行了透彻的讨论。首先阐述了面向对象软件项目的基本概念,然后基于广泛使用的方法,介绍了使用...

    Python 3面向对象编程

    Python 是一种面向对象的解释型语言,面向对象是其非常重要的特性。《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念...

    妙解Hibernate 3.x:叩响面向对象思想之门 PDF

    《妙解Hibernate 3.x:叩响面向对象思想之门》是一本深入解析Hibernate框架的专著,旨在帮助读者理解并掌握面向对象编程思想在实际开发中的应用,尤其是在使用Hibernate时如何有效地进行数据持久化。这本书是面向...

    面向对象分析与设计.pdf

    由于提供的文件内容不包含...由于无法直接从给定文件的重复链接中提取具体内容,以上内容为对面向对象分析与设计的一般性介绍,以确保满足您所要求的详细知识点说明。希望这些内容有助于增进您对面向对象方法的理解。

    实用面向对象软件工程教程

    面向对象软件工程是一种现代的软件开发方法,它基于对象的概念,强调模块化、可重用性和灵活性。本教程“实用面向对象软件工程教程”旨在深入探讨面向对象分析(OOA)和面向对象设计(OOD)的关键原则,帮助开发者...

    面向过程、面向对象、面向组件、面向服务软件架构的分析与比较

    面向过程、面向对象、面向组件、面向服务软件架构的分析与比较 软件开发历程与架构演进 软件开发从汇编语言、过程式语言、面向对象、面向组件发展到面向服务,这一进程不仅反映了编程技术的不断进步,更是软件工程...

    面向对象JavaScript精要(英文原版pdf)

    尽管JavaScript不是传统意义上的面向对象语言,但它提供了一些独特的特性,使其能够支持面向对象编程。 - **原型链**:JavaScript使用原型链来实现继承。每个对象都有一个内部属性[[Prototype]],指向其原型对象。...

    Matlab面向对象编程

    Matlab面向对象编程是一种在MATLAB环境下通过面向对象的方法来组织和构造程序代码的技术。面向对象编程(OOP)的基本特征包括抽象、封装、继承和多态。以下是根据给定的文件信息,对这些知识点的详细解释: 1. 抽象:...

    C++面向对象程序设计 经典例题 附练习题

    C++是一种强大的、通用的编程语言,以其支持面向对象编程(OOP)而闻名。面向对象编程是一种设计和实现软件的方式,它强调将现实世界的问题和解决方案映射到计算机程序中的对象。本资料包“C++面向对象程序设计 经典...

    codesys面向对象的方法属性动作接口

    codesys面向对象的方法属性动作接口 codesys面向对象的方法属性动作接口是指在codesys中实现面向对象编程的方法、属性和动作接口。这种接口允许用户在codesys中实现面向对象编程,使用继承、多态和封装等面向对象...

    用C-语言实现面向对象编程.pdf

    用 C 语言实现面向对象编程,我曾经在嵌入式控制系统工作过,苦于嵌入式系统编程一直是 C 语言,而没法用 C++或其他高级 语言的面向对象方法编程。经过研究生的学习和探索,...本人将其总结如下,希望对大家有帮助。

    Python3 面向对象编程

    Python 是一种面向对象的解释型语言,面向对象是其非常重要的特性。《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念...

    UML面向对象建模与设计答案

    《UML面向对象建模与设计答案》是一个包含详尽解答的资源,旨在帮助学习者理解和掌握UML(Unified Modeling Language)在面向对象设计中的应用。面向对象建模是软件开发过程中至关重要的一环,它通过可视化的方式...

    LabVIEW面向对象编程技术.pdf

    在对象的创建过程中,可以对对象的数据进行初始化。 LabVIEW 面向对象编程技术的优点在于可以提高程序的可维护性和可扩展性。通过类的定义和实例化,可以实现数据的封装和继承,提高程序的可维护性和可扩展性。 ...

    《C#面向对象程序设计》源代码(CS)

    本书以面向对象的软件工程思想为主线,细致深入地讲解了C#语言面向对象程序设计的方法和技巧,内容涵盖面向对象的基本概念、基于接口的设计、泛型程序设计方法、Windows和Web应用开发,以及数据库访问技术。...

    Python+3面向对象编程.

    Python 是一种面向对象的解释型语言,面向对象是其非常重要的特性。《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念...

    Python3面向对象编程

    Python 是一种面向对象的解释型语言,面向对象是其非常重要的特性。《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念...

Global site tag (gtag.js) - Google Analytics