锁定老帖子 主题:两进程修改数据库,不同步问题的解决办法
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-29
一个进程不断查询数据库,看某个字段时候已经被修改,如果修改则做下一步工作;如果没有修改继续循环查询 另外一个进程由用户操作去更新数据库中的这个字段
问题是,在上面这样的场景中,查询数据库的进程根本看不到数据被修改
解决办法:
给第一个查询部分也加上事务管理的代码(一般情况下,对于修改,更新部分的代码才进行事务的管理,而这种查询代码都是直接查询的)
TasksDAO dao = new TasksDAO(); Transaction tran = dao.getSession().beginTransaction(); Tasks task = dao.findById(id); tran.commit(); dao.getSession().close(); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-30
?为什么会查不到呢
|
|
返回顶楼 | |
发表时间:2009-06-30
aaron7524 写道 ?为什么会查不到呢
应该是缓存的问题,hibernate缓存了数据库连接 |
|
返回顶楼 | |
发表时间:2009-06-30
最后修改:2009-06-30
通过ID的查询应该是一级缓存给缓存了,你也可以先evict(Object object)从缓存中驱逐指定的对象,之后再查询试试看
|
|
返回顶楼 | |
发表时间:2009-06-30
注意,如果使用了Hibernate之类的ORM并且使用了二级缓存,那么一定要保证所有的修改均通过该ORM进行。而且还要注意修改对缓存的影响,是否造成了脏数据。
其次,确认数据库的隔离级别,确保脏读、幻读、不可重复读等问题不至于影响数据安全。 如果你是两个完全单独的程序交互操作数据库,那么不要使用二级缓存。 |
|
返回顶楼 | |
发表时间:2009-06-30
为什么不用观察者模式来实现你的功能?
|
|
返回顶楼 | |
发表时间:2009-06-30
最后修改:2009-06-30
或者用aop,拦截你做修改操作的接口
|
|
返回顶楼 | |
发表时间:2009-06-30
我觉得可以试试数据库的触发器
|
|
返回顶楼 | |
发表时间:2009-06-30
casheen 写道 为什么不用观察者模式来实现你的功能?
的确,观察者模式。不过我有疑问,如果使用观察者模式,应该怎么样去实现 自己没有试过,对这个很感兴趣。 不过我想如果自己写个类似于通知的东西应该更加简单,简洁一些。 |
|
返回顶楼 | |
发表时间:2009-06-30
你的 修改 是
Tasks task = dao.findById(id); task.setXX(XX) 吗? 要是这样的话 应该不会有问题吧 |
|
返回顶楼 | |