两个JVM实例访问同一个DB引起的幻读如何解决

codelabs 2016-05-12 11:26:01
微服务程序A部署了两套,分别位于两个tomcat中,两个tomcat后端挂的是同一个DB。微服务程序中在初始化的时候会从DB中 select一批数据到内存,读取的原则是:先从【游标表】中获取到资源表的【当前可用位置】,然后【从此位置】开始读取资源表的一批数据到内存。现在出现的问题是:tomcat1和tomcat2重启的时候都从DB读取到了一模一样的数据到内存中?如何解决读取到同一批数据的问题。此问题暂时只在重启的时候出现过,其它正常访问的时候暂未发现。

从【游标表】中读取资源表【可用位置】的时候加锁处理了,代码如下——
@SuppressWarnings("unchecked")
public T getForUpdate(Serializable id) throws DataAccessException, Exception {
return (T) getHibernateTemplate().get(type(), id, LockMode.UPGRADE);
}
...全文
115 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Intboy 2016-05-12
  • 打赏
  • 举报
回复
如何解决读取到同一批数据的问题 都读,为什么会读取不一样的数据?
Intboy 2016-05-12
  • 打赏
  • 举报
回复
引用 2 楼 paopaoxiu 的回复:
[quote=引用 1 楼 fengspg 的回复:] 如何解决读取到同一批数据的问题 都读,为什么会读取不一样的数据?
两个Tocmat中的程序挂了同一个DB,读取的是资源表。资源表按序号递增,如:1001,1002,1003,1004......200000。要求:从资源表读取数据时,两个Tomcat中的程序读取的数据是不一样的。如:初始化读取5条数据,那么Tomcat1中的程序读取到的数据就是序号(1001,1002,1003,1004,1005)对应的记录;而Tomcat2中的程序读取到的数据应该就是序号1006,1007,1008,1009,1010对应的记录。[/quote] 明白了,这种是不是读取的时候加锁比较好,加入tomcat1先读,select xxx for update,此时读5条数据,同时在表里更新flag,标志下读到哪里了,然后tomcat2从此标志开始读。不过这样耦合性太高。 我觉得可以写个配置文件,如A配置需要读的ID范围是1001到1005,B配置1005到1010,然后where条件根据这个ID范围去读;
codelabs 2016-05-12
  • 打赏
  • 举报
回复
引用 1 楼 fengspg 的回复:
如何解决读取到同一批数据的问题 都读,为什么会读取不一样的数据?
两个Tocmat中的程序挂了同一个DB,读取的是资源表。资源表按序号递增,如:1001,1002,1003,1004......200000。要求:从资源表读取数据时,两个Tomcat中的程序读取的数据是不一样的。如:初始化读取5条数据,那么Tomcat1中的程序读取到的数据就是序号(1001,1002,1003,1004,1005)对应的记录;而Tomcat2中的程序读取到的数据应该就是序号1006,1007,1008,1009,1010对应的记录。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧