`
kungstriving
  • 浏览: 129247 次
  • 性别: 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部分。 部分业务模块慢 分析运行慢...

    分布式数据库的设计与实现.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 查询和标签带有语法突出显示的简单易用...

    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多核...

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

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

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

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

    OGG安装与配置.docx

    非常详细的OGG安装、配置、维护文档 1. OGG安装与配置 1 1.1. 方案介绍 1 1.1.1. 操作系统和数据库版本 2 ...1.5.5. 查看和修改进程配置 16 1.5.6. 查看文件系统使用情况 16 1.5.7. 增加表 16 1.5.8. 修改表 18

    基于微服务的车票管理系统源码+项目说明+sql数据库.tar

    功能描述:微服务车票系统,分管理员和普通用户两种角色。除了基本功能,可实现限流,一人一单,每日热搜等功能 #### 涉及技术栈:MySQL,Redis,RabbitMQ,MybatisPlus,SpringBoot,SpringCloud,Seata,Sentinel...

    常用SQL 语句大全

    15.如何修改数据库的名称: 第二部分、 提升 1、复制表 2、拷贝表 3、跨数据库之间表的拷贝 4、子查询 5、显示文章、提交人和最后回复时间 6、外连接查询 7、在线视图查询 8、between的用法 9、in 的使用...

    C#线程锁介绍源码

    lock和Monitor是.NET用一个特殊结构实现的,Monitor对象是完全托管的、完全可移植的,并且在操作系统资源要求方 面可能更为有效,同步速度较快,但不能跨进程同步。lock(Monitor.Enter和Monitor.Exit方法的封装)...

    Oracle Stream-安装配置

     Streams 通过capture进程捕获dml,ddl操作,然后通过propagate进程传播到其它数据库,然后再通过apply进程应用的方式复制数据。这中间的每个步骤都是可定制的, 2、 数据保护Data Protection  最有效的数据...

    mysql5.7操作文档大全

    9.3 将待恢复的<table_name>.ibd文件copy到目标数据库文件夹下,并修改文件权限 40 9.4 导入表空间 41 十. 根据frm文件恢复表结构 42 10.1 新建同名的表 42 10.1.1 建立新的表结构 42 10.1.2 修改新建的数据表结构为...

    GuardianGenius(守护精灵) 1.0.rar

     在线支持:由于多年处于IT业产品开发维护的最前沿,深知用户使用反馈的珍贵,以及用户的遇到问题是迫切需要解决时的焦 急心情,特此开发在线支持功能,您无需登录网站、论坛、发送电子邮件等,即可将您的反馈信息...

Global site tag (gtag.js) - Google Analytics