我有一个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.
}
Run Code Online (Sandbox Code Playgroud)
现在没有任何类型的同步,所以n个线程当然可以自由地访问这个方法,当2个线程进入这个方法同时检查时会出现问题,当然还没有任何东西,然后他们都可以提交事务,创建重复的对象.
我不想在我的数据库中使用唯一的密钥标识符来解决这个问题,因为我不认为我应该抓住它SQLException.
我也无法在提交之前检查,因为不仅有几个检查1,这将花费相当长的时间.
我对锁和线程的体验是有限的,但我的想法基本上是将这个代码锁定在它接收的对象上.我不知道例如说我收到一个Integer对象,并且我用值1锁定我的Integer,是否只会阻止另一个值为1的Integer进入,而所有其他线程value != 1都可以自由进入?这是怎么回事?
此外,如果这是它的工作原理,锁对象如何比较?它是如何确定它们实际上是同一个对象的?关于这一点的好文章也将受到赞赏.
你怎么解决这个问题?