java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint während der Ausführung von Oracle-Funktionen
Ich bin immer java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint Fehler beim starten der oracle-Funktion verwenden mybatis. Ich konfigurierte Frühjahr Transaktion ausgeführt Serialisierbare mit readOnly false. Unten ist das meine mapper-Klasse
public interface ILockMapper {
@Transactional(isolation=Isolation.SERIALIZABLE, readOnly=false)
String aquireLock(final SpInOutFields input);
@Transactional(isolation=Isolation.SERIALIZABLE, readOnly=false)
String releaseLock(final SpInOutFields input);
}
Meine aquireLock
Methode läuft meine oracle-Funktion, Die oracle-Funktion hat zwei insert-Anweisungen. vor dem einfügen der Daten ich überprüfen ob die Daten vorhanden ist oder nicht mit " select count(*) für die angegebenen Daten. wenn vorhanden würde ich nicht einfügen, werden die Daten der Probe pl-sql-Anweisung ist, hier unten
SELECT COUNT(*) INTO rowcount FROM kp_lock WHERE device_id = deviceId;
if rowcount = 0 then
INSERT INTO kp_lock(device_id,lock_flag,request_time) values ( deviceId, 'YES', CURRENT_TIMESTAMP);
status := threadSysId;
else
status := '';
end if;
Wenn ich die Funktion ausführen von oracle funktioniert es einwandfrei. Und es funktioniert, wenn ich einen einzelnen thread aber fehl, wenn ich laufen multi-threaded.
Mein JUNIT-test-Klasse ist unten
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:config/spring-context.xml"})
public class TestSerialization {
@Autowired
ApplicationContext context;
@Test
public void testSerialize() throws InterruptedException{
MultiThread multithread = context.getBean(MultiThread.class);
MultiThread multithread1 = context.getBean(MultiThread.class);
Thread thread = new Thread(multithread);
Thread thread1 = new Thread(multithread1);
thread.start();
if(multithread == multithread1){
System.out.println("Both refer same instance");
}
thread1.start();
try {
thread.join();
thread1.join();
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Könnten einige bitte helfen Sie mir, zu konfigurieren Transaktion ausgeführt in synchroner Art und Weise. Nicht sicher, wohin ich gehe falsch
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das problem mit nicht-Unteilbarkeit von der Funktion, die führt zu einer race-condition. In multi-Threading-Umgebung einige andere Threads ausgeführt werden kann, zwischen überprüfen, ob Datensatz vorhanden und einfügen passiert.
Sie dieses problem beheben können, allein durch die Transaktion Konfiguration. Was Sie tun müssen, ist, um bedingt einfügen.
Es sieht aus wie Sie versuchen, zu implementieren benutzerdefinierte sperren. Erwägen Sie die Verwendung Benutzerdefinierte Sperren