java同步,实现insert的唯一性
业务流程:查询表中是否有某条记录,如果没有就insert,如果存在就update.
问题1:在执行insert的过程中,因为有多个对象对一个表进行select操作,对象A先执行select操作,查询表中没有该条数据,再去执行insert。但是对象B在对象A还没有执行完insert操作的过程中,就去执行select操作,也发现没有该条数据,执行insert操作。最后结果可想而知,插入了多条id相同,其他字段不同的数据。
解决:使用同步(synchronized)。
synchronized的参数:class。我将(dao层接口名.class)作为参数————(说实话我这里也没太搞明白 ,接口为啥能.class希望大佬能解答我的问题)。
这样一来每个对象只能等待上个对象处理完insert等一系列操作,才会解锁并交给下个对象去执行。保证了insert的唯一性。
小拓展:
1.synchronized也可以作为修饰符放在方法,对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
2、每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码
3、实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制
这里只提供一个例子,详细的使用方法还请自寻
4.synchronized锁,只是锁的jvm下的对象,无法应对分布式多集群多个jvm的情况。处理分布式集群要使用分布式锁
接口.class 也是一个Class 实例, 在同一个Classloador 中唯一。
在多机集群或多实例的情况下,即使使用 synchronized
也无法保证同步。因为 synchronized
是基于 Java 虚拟机内部的锁机制,在不同的 JVM 实例之间无法共享锁状态,因此无法实现跨 JVM 实例的同步。
java同步,实现insert的唯一性
本文2024-09-16 21:56:45发表“eas cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-eas-44930.html