`
kungstriving
  • 浏览: 129655 次
  • 性别: 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  
?为什么会查不到呢

相关推荐

    linux下mysql数据库单向同步配置方法分享

    又叫做主从复制,是通过二进制日志文件完成的,注意:mysql 数据库的版本,两个数据库...对my.cnf进行修改需要重启动数据库设置才会生效,如果不想对指定数据库同步进行限制,直接跳过这步 [root@kt /]# service

    数据库项目组日常运维及应急故障处理手册.docx

    此时首先查看系统资源,看是否属于CPU资源使用率100%的问题,如果是,参考本章“CPU使用率高的问题”解决办法。如果系统资源正常,那很可能是数据库hang住了,此时参考数据库Hang部分。 部分业务模块慢 分析运行慢...

    分布式数据库-MySQL Sharding1

    这个过程需要停止写服务,修改中间层的映射规则,并将原来的 dbgroup 数据同步到新的 dbgroup 上。 在实践中, MySQL Sharding1 需要考虑数据库复制、扩容问题、动态数据迁移问题等问题。例如,在大型互联网公司...

    分布式数据库的设计与实现.doc

    各部门的数据有更 新变动时,也要及时上报在全局数据库同步更新。再由全局数据库分发给与数据信息有 关的相关部门。如某系学生人数的变化要通知后勤服务部门。人事部门上报教工工作的 调动情况要通知财会部门等。...

    OracleGoldenGate在Windows平台的双向数据传输配置及其测试

    第4章 把源数据库的修改数据同步到目标数据库中 21 4.1 在源数据库配置一个EXTRACT进程及配置其文件 21 4.1.1 配置EXTRACT文件 21 4.1.2 在GGSCI.exe增加一个EXTRACT进程 22 4.2 配置data pump 23 4.2.1 在源数据库...

    Linux系统编程之线程同步

    数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致;文件同步,是指让两个或多个文件夹里的文件保持一致。等等 而,编程中、通信中所说的同步与生活中大家印象中的同步概念略有差异。“同”...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    10.4.6其他守护进程不能启动 10.4.7 CRSD代理不能启动 10.5修改RAC节点网络配置 10.5.1修改VIP地址 10.5.2修改SCAN VIP地址 10.5.3修改私有IP地址 10.5.4修改内联网络接口 10.5.5修改公共IP地址 10.5.6修改...

    数据库操作语句大全(sql)

    注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 ...

    HeidiSQL7.0 中文版 汉化版

    此外,你可以从文本文件导入数据,运行 SQL查询,在两个数据库之间同步表以及导出选择的表到其它数据库或者 SQL 脚本当中。HeidiSQL 提供了一个用于在数据库浏览之间切换 SQL 查询和标签带有语法突出显示的简单易用...

    sqlserver链接oracle数据库

    在实际应用中,我们经常会遇到在对 SQL Server 的某一张表进行增加、删除、修改操作时,需同步更新同一数据库或不同数据库的另一张表,此时我们可以使用 SQL Server 的表触发器来实现。 触发器知识点 使用触发器时...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    18-挂载测试数据库同步及查看备节点数据.avi 第十四部 MySQL高可用综合实战(完整版32节) 01-重要课前思想mp4 02-MySQL高可用需求与架构讲解mp4 03-大规模集群架构中MySQL高可用的位置和架构mp4 04-MySQL高可用...

    mysql数据库my.cnf配置文件

    # 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64 innodb_thread_concurrency = 0 # 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核...

    mysql数据在线热迁移+mysql双主+keepalived高可用集群环境

    停止主从同步进程,以实现热迁移。 搭建 masterB 搭建 masterB 节点,以实现双主架构。 编辑配置文件 需要编辑 /etc/my.cnf 和 /etc/keepalived/keepalived.conf 配置文件,以实现 MySQL 和 Keepalived 的高可用...

    ORACLE培训.pptx

    每一个数据文件只与一个数据库相联系,数据文件一旦被建立则不能修改其大小。一个表空间可包含一个或多个数据文件。 * 日志文件(Log File):记录所有对数据库数据的修改,以备恢复数据时使用。每一个数据库至少...

    2023年年上半年数据库系统工程师考试上午真题下午真题.docx

    12. 进程同步与互斥:假设铁路自动售票系统有 n 个售票终端,该系统为每个售票终端创建一个进程 Pi(i=1,2,…,n)管理车票销售过程。初始化时系统应将信号量 S 赋值为 1。 这些知识点涵盖了计算机系统、算法与...

    哈工大 操作系统实验4 linux0.01信号量的实现 代码及相关提交

    不好的哦,你可以看看了解下思路,针对不明白的细节可以帮助你查漏补缺,因为提交的cms网站是会查雷同的,而之前的同学提交的东东仍然在网站的数据库中哦,千万不要以为自己捡到馅饼了,还有忠告大家的就是如果真的...

    分布式锁与信号量概述.pdf

    分布式锁和信号量是在分布式系统中解决并发和同步问题的两种重要机制。它们在多个进程、线程或者机器之间协调资源访问和操作执行时起着关键作用。下面将分别详细概述分布式锁和信号量。 分布式锁 定义 分布式锁是...

    postgresql replication源码解析。

    PostgreSQL 复制可以分为逻辑复制和物理流复制两种,逻辑复制可以在数据层面上复制,并在安全性上提供更细粒度的控制,而物理流复制可以实现数据库主备同步技术,该特性同步的数据是数据库中物理页面变化数据(WAL)...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    解决在 PD leader 发送切换的情况下 gRPC call 不返回问题 解决由于 snapshot 导致下线节点慢的问题 限制搬移副本临时占用的空间大小 如果有 Region 长时间没有 Leader,进行上报 根据 compaction 事件及时更新...

Global site tag (gtag.js) - Google Analytics