我有一个Web应用程序,使用的是Oracle数据库,我有一个基本上像这样的方法:
public static void saveSomethingImportantToDataBase(Object theObjectIwantToSave) {
if (!methodThatChecksThatObjectAlreadyExists) {
storemyObject() //pseudo code
}
// Have to do a lot other saving stuff, because it either saves everything or nothing
commit() // pseudo code to actually commit all my changes to the database.
}
目前没有任何形式的同步,因此n个线程可以自由地访问该方法,当2个线程进入该方法时,它们都会进行检查,当然还没有什么内容,然后它们都可以提交事务,从而创建重复对象。
我不想通过数据库中的唯一键标识符来解决这个问题,因为我认为我不应该捕获那个SQLException
异常。
我也不能在提交之前检查,因为有几个检查条件,不仅仅是1
,这需要相当长的时间。
我的锁和线程经验有限,但我的想法基本上是锁定接收到的对象的代码。例如,如果我接收一个整数对象,并锁定值为1的整数,那么只有具有另一个值为1的整数的线程才会被阻止进入,所有其他值为value!= 1
的线程都可以自由进入吗?这是它的工作原理吗?
此外,如果是这样,如何比较锁定对象?如何确定它们实际上是相同的对象?欢迎提供好的文章。
你会如何解决这个问题?