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

Schreibe einen Kommentar