`
kungstriving
  • 浏览: 131375 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

两进程修改数据库,不同步问题的解决办法

阅读更多

一个进程不断查询数据库,看某个字段时候已经被修改,如果修改则做下一步工作;如果没有修改继续循环查询

另外一个进程由用户操作去更新数据库中的这个字段

 

问题是,在上面这样的场景中,查询数据库的进程根本看不到数据被修改

 

解决办法:

 

给第一个查询部分也加上事务管理的代码(一般情况下,对于修改,更新部分的代码才进行事务的管理,而这种查询代码都是直接查询的)

 

TasksDAO dao = new TasksDAO();
				Transaction tran = dao.getSession().beginTransaction();
				Tasks task = dao.findById(id);
				tran.commit();
				dao.getSession().close();
 
分享到:
评论
20 楼 faylai 2009-07-01  
这样的设计就有问题,本身轮询数据库就不是件好事。
19 楼 ray_linn 2009-07-01  
rain2005 写道
ray_linn 写道
只能说这个设计太搓了,明知道有别的进程还需要修改数据库,还会用上hibernate。
为什么有别的进程还需要修改数据库就不能用hibernate,只要不启用二级缓存就OK。


无非以性能为代价呗。
18 楼 rain2005 2009-07-01  
ray_linn 写道
只能说这个设计太搓了,明知道有别的进程还需要修改数据库,还会用上hibernate。
为什么有别的进程还需要修改数据库就不能用hibernate,只要不启用二级缓存就OK。
17 楼 rain2005 2009-07-01  
你犯下最致命的错误的你根本不了解hibernate的工作方式,很明显在一个线程里面使用session总是命中一级缓存,
你修改后的代码能够成功的关键在这里
dao.getSession().close(); 

与事务无关,就算启用事务,对象还是在session缓存里面。

解决方式很多,比如清一级缓存,你选择了最差的一种方式。

再多说一句,查询怎么都不加事务?这毛病得改改。
16 楼 kungstriving 2009-07-01  
具体问题的原因我也没有去深入研究,但是采用给查询也加上事务的方法确实可以解决我的问题,呵呵
我有点急功近利了
15 楼 longtinghappy 2009-07-01  
为什么不用个标签,只要查标签就可以知道数据库里改动没有,用在数据库里做这么多的查询
14 楼 wangzy 2009-07-01  
这么累阿,用hibernate乐观锁
13 楼 ray_linn 2009-07-01  
dengtl 写道
触发器 -> Java -> Send Message(JMS) -> MBean or Message Process Center


oracle才能这么玩吧。
12 楼 dengtl 2009-07-01  
触发器 -> Java -> Send Message(JMS) -> MBean or Message Process Center
11 楼 holan 2009-07-01  
没搞明白,session是一级缓存,你每次查询如果重新建个session,再查询,会出现你说的情况吗?

如果不显示打开事务,每一次执行sql语句应该都是自动启动一个事务啊
10 楼 ray_linn 2009-07-01  
只能说这个设计太搓了,明知道有别的进程还需要修改数据库,还会用上hibernate。
9 楼 whaosoft 2009-06-30  
你的 修改 是
Tasks task = dao.findById(id);
task.setXX(XX) 吗? 要是这样的话 应该不会有问题吧
8 楼 treblesoftware 2009-06-30  
casheen 写道
为什么不用观察者模式来实现你的功能?


的确,观察者模式。不过我有疑问,如果使用观察者模式,应该怎么样去实现 自己没有试过,对这个很感兴趣。 不过我想如果自己写个类似于通知的东西应该更加简单,简洁一些。
7 楼 jianfeihit 2009-06-30  
我觉得可以试试数据库的触发器
6 楼 casheen 2009-06-30  
或者用aop,拦截你做修改操作的接口
5 楼 casheen 2009-06-30  
为什么不用观察者模式来实现你的功能?
4 楼 魔力猫咪 2009-06-30  
注意,如果使用了Hibernate之类的ORM并且使用了二级缓存,那么一定要保证所有的修改均通过该ORM进行。而且还要注意修改对缓存的影响,是否造成了脏数据。
其次,确认数据库的隔离级别,确保脏读、幻读、不可重复读等问题不至于影响数据安全。
如果你是两个完全单独的程序交互操作数据库,那么不要使用二级缓存。
3 楼 香克斯 2009-06-30  
通过ID的查询应该是一级缓存给缓存了,你也可以先evict(Object object)从缓存中驱逐指定的对象,之后再查询试试看
2 楼 kungstriving 2009-06-30  
aaron7524 写道
?为什么会查不到呢

应该是缓存的问题,hibernate缓存了数据库连接
1 楼 aaron7524 2009-06-30  
?为什么会查不到呢

相关推荐

    JAVA 线程实现数据库的主从同步更新

    2. **从数据库同步线程**: 从数据库的同步线程需要定期查询主数据库的最新状态。这可以通过定时任务实现,例如使用Java的`java.util.Timer`或`ScheduledExecutorService`。在每次同步时,从数据库线程获取主数据库...

    mysql 数据库的同步问题(双机热备).pdf

    ### MySQL 数据库同步问题详解(双机热备) #### 一、引言 在现代企业的IT架构中,数据库同步是一项非常重要的技术。特别是在双机热备的场景下,确保两地数据库的一致性对于提高系统的可用性和可靠性至关重要。...

    针对数据库出现的一些问题总结

    【数据库登录问题与解决方案】 在使用SQL Server数据库时,初学者常常会遇到各种登录问题,这些问题可能涉及到账户锁定、密码策略以及网络连接等。以下是一些常见问题的详细解析及解决办法。 首先,我们来看“sa ...

    ORACLE 10G 数据库 通过STREAM实现数据库双向同步

    这不同于传统的单向复制,双向同步能够处理两个方向的数据更新,避免了数据冲突,并且能够在网络中断后恢复时自动解决数据不一致的问题。 ### ORACLE 10G中实现双向同步的关键组件 在ORACLE 10G中,实现双向同步...

    Oracle数据库的同步复制案例

    2. **更改数据库全局名称并创建公共数据库链接** - 更改深圳数据库的全局名称: ```sql alter database rename global_name to shenzhen.test.com.cn; ``` - 更改北京数据库的全局名称: ```sql alter ...

    进程同步模拟设计——读者和写者问题

    本报告书将深入探讨一种经典的问题——读者和写者问题,它是进程同步中的一个典型实例,常见于多用户环境,如数据库系统、文件系统等。 读者和写者问题涉及到一组进程(读者和写者)共享同一数据资源。读者只读取...

    oracle数据库同步技术

    Oracle数据库同步技术是一种在分布式数据库环境中确保数据一致性和完整性的关键技术。复制是这一技术的核心,它涉及在两个或多个数据库系统之间拷贝和维护数据。高级复制是Oracle提供的一种高效解决方案,它允许在...

    数据库进程间通信解决方案.docx

    数据库进程间通信解决方案是针对数据库系统与其他第三方应用程序之间需要实时同步数据或触发特定操作的场景。传统的查询方式可能无法满足这种实时性需求,因此需要设计一种机制,使得数据库能够主动通知其他进程数据...

    通过Oracle的流复制实现数据库之间的同步

    通过Oracle的流复制实现数据库之间的同步,是一种高效的数据同步机制,尤其在企业级应用中,对于数据一致性和实时性有着极高的要求。Oracle Streams作为Oracle数据库的一项重要特性,自Oracle9i版本开始引入,取代了...

    Mysql5.5数据库双向同步

    - 当从服务器上的复制进程遇到错误时,可以通过停止复制、跳过特定事件(如使用`set global sql_slave_skip_counter=1`)、重新启动复制来解决问题。 - 清理`master.info`和`relay-log.info`文件有助于处理因文件...

    oracle12C数据库同步

    针对“oracle12C数据库同步”这个主题,我们将深入探讨Oracle GoldenGate在Oracle 12c中的应用、配置过程以及它的重要性。 首先,Oracle GoldenGate支持双向同步,这意味着数据可以同时在源和目标数据库之间流动,...

    数据库进程间通信解决方案之MQ_2.docx

    这种解决方案尤其适用于那些不能直接修改数据库代码或需要在数据库变动时执行特定任务的情况。 1. **背景**: 在传统的数据库操作中,当数据发生变化时,通常需要通过定时查询来检测并执行相应的操作。这种方法...

    SQL Serve数据库发布和订阅(主从数据库同步)

    ### SQL Server 数据库发布和订阅(主从数据库同步) #### 概述 SQL Server 的发布与订阅机制是一种实现数据同步的重要方式,适用于多种场景,尤其是当需要在一个或多个位置之间同步数据时。本文档旨在详细介绍...

    多进程同步-生产者消费者模式-C实现

    生产者消费者模式基于操作系统提供的信号量(Semaphore)或管程(Monitor)等机制,以解决进程间的通信和同步问题。在这个模式中,生产者进程负责生成数据并放入缓冲区,而消费者进程则负责从缓冲区取出数据进行处理...

    sqlserver无主键表的同步方案1

    在SQL Server环境中,数据库同步是一项重要的任务,尤其在有多个数据源或需要实时更新的数据仓库中。当面临无主键的表同步时,传统的发布订阅方式可能无法满足需求,因为这种方式通常依赖于主键来跟踪和同步数据变化...

    Oracle远程数据库同步方法的研究.pdf

    《Oracle远程数据库同步方法的研究》这篇论文主要探讨了在分布式环境下如何实现Oracle数据库的同步策略,以及解决数据同步系统中的关键问题。以下是论文的核心内容: 首先,文章提到了分布式数据库的特点,即在逻辑...

    魔乐Oracle数据库同步笔记(李兴华)

    Oracle数据库同步是数据库管理中的一个重要概念,特别是在大型企业或分布式系统中,数据一致性与实时性是关键需求。李兴华的“魔乐Oracle数据库同步笔记”涵盖了这一领域的多个知识点,旨在帮助读者深入理解和掌握...

Global site tag (gtag.js) - Google Analytics