Java中如何实现两个应用的线程锁定问题
大概场景是这样的,我有两个应用,里面有一个相同的业务,比如是一个数据插入操作,为了避免出现并发业务数据混乱问题,每个应用加入了重入锁,但是现在针对于两个应用是进行的分别锁定。虽然保证每个应用的线程是独立的,即每个应用的指定方法里面只能保持一个线程的运行,但是不能保证两个应用中已经进入的线程是单独的,请问这种场景如果不做业务处理,可以用技术去实现么。从技术的角度,有没有这种类似于跨域线程的锁定,谢谢高手指点
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
回复
是的,我是想在后台通过hibernate的锁表机制把数据库进行行级锁,然后在save的时候对当前行进行锁定,此时其他的插入操作是不允许的,这样就可以保证插入的数据不是来自于两个应用的操作了。但是我想知道在save了以后,锁是不是就自动释放了,还是要手动在hibernate里面再去进行操作。
回复
锁表不太好,假如你A和B两个应用是要往User表插入数据的,你把User锁了。那还有个C模块是要更新User表中的记录的。那它就会无法更新。所以,针对你的业务进行锁。也就是建个字段,模拟真实锁的操作就行。
回复
两条数据同时获取数据库中唯一字段的信息,然后去分别进行+1操作,但是有一种可能也会出现,就是双方同时拿到了相同的信息,这样的话,只能异常处理其中一个,因为字段要设置成Unique的,所以其中有一条数据会插入失败,虽然这种可能性很小,大概是这种思路吧 。
回复
实际上我们业务上的需求,并不会出现两个业务同时去改同一张表,而且我需要改动的只是单条记录,需要用行级锁就可以了,只是这样会不会有造成死锁的可能性
回复
在数据库中做锁一旦控制不好就锁表了,整个业务就无法用了。如果你想用行级锁,你可以试试。我没用过。
引用来自“天王盖地虎”的评论
一个相同的业务在不同的应用中存在,为避免并发造成的数据混乱。可以在共享区域做锁,当然每个应用中也需要有锁的机制。如果在内存中控制的话,两个应用要是在不同的机器上还是有可能会出现问题。所以,还是在数据库中做锁吧。
数据库锁
锁定标识放到同一个缓存数据库里面(例如redis)。锁定和解锁都update同一个标识
一个相同的业务在不同的应用中存在,为避免并发造成的数据混乱。可以在共享区域做锁,当然每个应用中也需要有锁的机制。如果在内存中控制的话,两个应用要是在不同的机器上还是有可能会出现问题。所以,还是在数据库中做锁吧。