论坛首页 入门技术论坛

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

浏览 6975 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-06-29  

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

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

 

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

 

解决办法:

 

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

 

TasksDAO dao = new TasksDAO();
				Transaction tran = dao.getSession().beginTransaction();
				Tasks task = dao.findById(id);
				tran.commit();
				dao.getSession().close();
 
   发表时间:2009-06-30  
?为什么会查不到呢
0 请登录后投票
   发表时间:2009-06-30  
aaron7524 写道
?为什么会查不到呢

应该是缓存的问题,hibernate缓存了数据库连接
0 请登录后投票
   发表时间:2009-06-30   最后修改:2009-06-30
通过ID的查询应该是一级缓存给缓存了,你也可以先evict(Object object)从缓存中驱逐指定的对象,之后再查询试试看
0 请登录后投票
   发表时间:2009-06-30  
注意,如果使用了Hibernate之类的ORM并且使用了二级缓存,那么一定要保证所有的修改均通过该ORM进行。而且还要注意修改对缓存的影响,是否造成了脏数据。
其次,确认数据库的隔离级别,确保脏读、幻读、不可重复读等问题不至于影响数据安全。
如果你是两个完全单独的程序交互操作数据库,那么不要使用二级缓存。
0 请登录后投票
   发表时间:2009-06-30  
为什么不用观察者模式来实现你的功能?
1 请登录后投票
   发表时间:2009-06-30   最后修改:2009-06-30
或者用aop,拦截你做修改操作的接口
0 请登录后投票
   发表时间:2009-06-30  
我觉得可以试试数据库的触发器
0 请登录后投票
   发表时间:2009-06-30  
casheen 写道
为什么不用观察者模式来实现你的功能?


的确,观察者模式。不过我有疑问,如果使用观察者模式,应该怎么样去实现 自己没有试过,对这个很感兴趣。 不过我想如果自己写个类似于通知的东西应该更加简单,简洁一些。
0 请登录后投票
   发表时间:2009-06-30  
你的 修改 是
Tasks task = dao.findById(id);
task.setXX(XX) 吗? 要是这样的话 应该不会有问题吧
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics