Spring Locking

Mariexshhx

Bekanntes Mitglied
Wenn ich pessimistisches Locking nutze bekomme ich folgenende Fehlermeldung
Exception in thread "Thread-1" Exception in thread "Thread-2" org.springframework.transaction.TransactionSystemException: JDBC rollback failed; nested exception is java.sql.SQLException: Connection is closed

ich habe das Crudrepo annotiert:
Java:
public interface SpringDataGlossarRepository extends CrudRepository<Begriff, Integer> {
  List<Begriff> findAll();
@Lock(LockMode.PESSIMISTIC_READ)
  Optional<Begriff> findById(int id);
}


so sieht meine Methode aus:
Code:
 @Transactional
public void def(int id, String text){
    boolean successfull=false;
    int failcount=0;
    while(!successfull && failcount<4){
      try{
        definitionHinzufuegen(id,text);
        successfull=true;
      }
      catch(ConcurrencyFailureException ex){
        failcount ++;
      }
    }
    if(!successfull) throw new RuntimeException("fehlgeschlagen");
}


Ich habe mit 2 Threads getestet
Code:
      Thread t1 = new Thread(()->service.def(1,"aloha"));
      Thread t2 = new Thread(()->service.def(1,"hi"));

      t1.start();
      t2.start();

wieso wird hier eine SQL Exception geworfen ?
 

Marinek

Bekanntes Mitglied
Es sieht so aus, als ob die Verbindung zur Datenbank unterbrochen oder unerwartet beendet wurde.

Wie startest du die Threads? Es kann sein, da du nicht auf die Ausführung der Threads wartest, dass der Context geschlossen wird und dann die connection geschlossen wird.

Hier habe ich noch etwas gefunden, was detaillierter ist:


Die Fragen, die ich mir stelle:

  • Wird service Autowired?
  • Sind Transaktionen überhaupt in der DB aktiviert?
  • Wenn sie aktiviert sind, ist autocommit deaktiviert?
  • Ist das ein HTTP Request Context?
Ist das etwas, was du in der UNI/Schule gerade lernst und es nutzen musst? Weil dein Anwendungsfall "ich möchte was schreiben" irgendwie nicht zur Lösung "pesimistic locking" passt. Und du gemäß deiner benennung der Methoden scheinbar nur werte hinzufügst und sie nicht liest und nicht änderst. Also egal?

Gruß,
Martin
 
Zuletzt bearbeitet:

Mariexshhx

Bekanntes Mitglied
es geht ja darum wenn ich auf den selben Begriff gleichzeitig Definitionen hinzufüge
Code:
  public void definitionHinzufuegen(int id, String text) {
    Begriff begriff = begriff(id);
    begriff.addDefinition(text);
    repository.save(begriff);
  }
der Service wird nicht autowired er ist mit @Service annotiert und wird dem CommandlineRunner übergeben

Java:
@Bean
  CommandLineRunner start(GlossarService service){
    return args->{

Ich nutze Postgres mit Docker wie muss ich da Transaktionen aktivieren? und ich mache das ganze für die Uni
 

Marinek

Bekanntes Mitglied
Dann liegt das wohl daran, dass dein Programm beendet wird, bevor es alle Operationen durch hat.

Gibt es darauf Hinweise im Log?

sonst mach mal nach "Zeile 6"

Java:
t1.join();
t2.join();
und ich mache das ganze für die Uni
Und die UNI gibt dir vor Pesimitic Locking zu "üben" oder hast du das Vorgehen selbst gewählt?
 

Mariexshhx

Bekanntes Mitglied
Dann liegt das wohl daran, dass dein Programm beendet wird, bevor es alle Operationen durch hat.

Gibt es darauf Hinweise im Log?

sonst mach mal nach "Zeile 6"

Java:
t1.join();
t2.join();

Und die UNI gibt dir vor Pesimitic Locking zu "üben" oder hast du das Vorgehen selbst gewählt?
die gibt vor das damit zu üben
wenn ich join nutze kommt dieser Fehler
1679231269597.png
 

Marinek

Bekanntes Mitglied
Also du musst ZUSÄTZLICH zu start noch die Zeilen hinzufügen und join schreiben. Man müsste sich mit den Antworten auch eine minimale Zeit beschäftigen... Hmm. Der schreibt ich soll quellcode hinzufügen. Was macht er wohl?!?

Ich verstehe auch nicht, wieso man Screenshots davon macht, statt hier den Text zu posten ;). Meine Antworten sind ja auch keine Screenshots von URLS.

Die neue Fehlermeldung ist ja auf dem Bild abgeschnitten.
 

Mariexshhx

Bekanntes Mitglied
Code:
Exception in thread "Thread-2" org.springframework.data.relational.core.conversion.DbActionExecutionException: Failed to execute DbAction.UpdateRoot(entity=Begriff[id=1, name=hallo, definitionen=[Definition[content=hi], Definition[content=aloha], Definition[content=marie], Definition[content=hello], Definition[content=bye]]])
    at org.springframework.data.jdbc.core.AggregateChangeExecutor.execute(AggregateChangeExecutor.java:95)
    at org.springframework.data.jdbc.core.AggregateChangeExecutor.lambda$execute$0(AggregateChangeExecutor.java:52)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.springframework.data.relational.core.conversion.DefaultAggregateChange.forEachAction(DefaultAggregateChange.java:127)
    at org.springframework.data.jdbc.core.AggregateChangeExecutor.execute(AggregateChangeExecutor.java:52)
    at org.springframework.data.jdbc.core.JdbcAggregateTemplate.store(JdbcAggregateTemplate.java:360)
    at org.springframework.data.jdbc.core.JdbcAggregateTemplate.save(JdbcAggregateTemplate.java:161)
    at org.springframework.data.jdbc.repository.support.SimpleJdbcRepository.save(SimpleJdbcRepository.java:75)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:530)
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:286)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:640)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:164)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:139)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:81)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
    at jdk.proxy2/jdk.proxy2.$Proxy71.save(Unknown Source)
    at glossar.database.GlossarRepositoryImpl.save(GlossarRepositoryImpl.java:37)
    at glossar.database.GlossarRepositoryImpl$$FastClassBySpringCGLIB$$ed5a7565.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
    at glossar.database.GlossarRepositoryImpl$$EnhancerBySpringCGLIB$$2235931e.save(<generated>)
    at glossar.service.GlossarService.definitionHinzufuegen(GlossarService.java:47)
    at glossar.service.GlossarService.def(GlossarService.java:31)
    at glossar.service.GlossarService$$FastClassBySpringCGLIB$$27842e86.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
    at glossar.service.GlossarService$$EnhancerBySpringCGLIB$$f55a2a7e.def(<generated>)
    at glossar.GlossarApplication.lambda$start$1(GlossarApplication.java:28)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: org.springframework.dao.DeadlockLoserDataAccessException: PreparedStatementCallback; SQL [UPDATE "begriff" SET "name" = ? WHERE "begriff"."id" = ?]; ERROR: deadlock detected
  Detail: Process 869 waits for ShareLock on transaction 804; blocked by process 868.
Process 868 waits for ShareLock on transaction 805; blocked by process 869.
  Hinweis: See server log for query details.
  Wobei: while updating tuple (0,48) in relation "begriff"; nested exception is org.postgresql.util.PSQLException: ERROR: deadlock detected
  Detail: Process 869 waits for ShareLock on transaction 804; blocked by process 868.
Process 868 waits for ShareLock on transaction 805; blocked by process 869.
  Hinweis: See server log for query details.
  Wobei: while updating tuple (0,48) in relation "begriff"
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:271)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
    at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:328)
    at org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategy.update(DefaultDataAccessStrategy.java:147)
    at org.springframework.data.jdbc.core.JdbcAggregateChangeExecutionContext.updateWithoutVersion(JdbcAggregateChangeExecutionContext.java:313)
    at org.springframework.data.jdbc.core.JdbcAggregateChangeExecutionContext.executeUpdateRoot(JdbcAggregateChangeExecutionContext.java:109)
    at org.springframework.data.jdbc.core.AggregateChangeExecutor.execute(AggregateChangeExecutor.java:72)
    ... 60 more
Caused by: org.postgresql.util.PSQLException: ERROR: deadlock detected
  Detail: Process 869 waits for ShareLock on transaction 804; blocked by process 868.
Process 868 waits for ShareLock on transaction 805; blocked by process 869.
  Hinweis: See server log for query details.
  Wobei: while updating tuple (0,48) in relation "begriff"
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2675)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2365)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:355)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:490)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:408)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:167)
    at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:135)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
    at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651)
    ... 67 more
[Begriff{id=1, name='hallo', definitionen=[Definition[content=hi], Definition[content=aloha], Definition[content=marie], Definition[content=hello], Definition[content=bye]]}]
2023-03-19 23:14:54.909 ERROR 78561 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) ~[spring-boot-2.7.5.jar:2.7.5]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:755) ~[spring-boot-2.7.5.jar:2.7.5]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.7.5.jar:2.7.5]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.5.jar:2.7.5]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.5.jar:2.7.5]
    at glossar.GlossarApplication.main(GlossarApplication.java:14) ~[main/:na]
Caused by: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT "begriff"."id" AS "id", "begriff"."name" AS "name" FROM "begriff" WHERE "begriff"."id" = ? FOR SHARE OF "begriff"]; SQL state [25006]; error code [0]; ERROR: cannot execute SELECT FOR SHARE in a read-only transaction; nested exception is org.postgresql.util.PSQLException: ERROR: cannot execute SELECT FOR SHARE in a read-only transaction
    at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1542) ~[spring-jdbc-5.3.23.jar:5.3.23]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) ~[spring-jdbc-5.3.23.jar:5.3.23]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713) ~[spring-jdbc-5.3.23.jar:5.3.23]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:738) ~[spring-jdbc-5.3.23.jar:5.3.23]
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:794) ~[spring-jdbc-5.3.23.jar:5.3.23]
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:243) ~[spring-jdbc-5.3.23.jar:5.3.23]
    at org.springframework.data.jdbc.repository.query.AbstractJdbcQuery.lambda$singleObjectQuery$1(AbstractJdbcQuery.java:120) ~[spring-data-jdbc-2.4.5.jar:2.4.5]
    at org.springframework.data.jdbc.repository.query.PartTreeJdbcQuery.execute(PartTreeJdbcQuery.java:131) ~[spring-data-jdbc-2.4.5.jar:2.4.5]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.7.5.jar:2.7.5]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.7.5.jar:2.7.5]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:160) ~[spring-data-commons-2.7.5.jar:2.7.5]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:139) ~[spring-data-commons-2.7.5.jar:2.7.5]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:81) ~[spring-data-commons-2.7.5.jar:2.7.5]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.23.jar:5.3.23]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.23.jar:5.3.23]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.23.jar:5.3.23]
    at jdk.proxy2/jdk.proxy2.$Proxy71.findById(Unknown Source) ~[na:na]
    at glossar.database.GlossarRepositoryImpl.findById(GlossarRepositoryImpl.java:30) ~[main/:na]
    at glossar.database.GlossarRepositoryImpl$$FastClassBySpringCGLIB$$ed5a7565.invoke(<generated>) ~[main/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.23.jar:5.3.23]
    at glossar.database.GlossarRepositoryImpl$$EnhancerBySpringCGLIB$$2235931e.findById(<generated>) ~[main/:na]
    at glossar.service.GlossarService.begriff(GlossarService.java:41) ~[main/:na]
    at glossar.service.GlossarService$$FastClassBySpringCGLIB$$27842e86.invoke(<generated>) ~[main/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.23.jar:5.3.23]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704) ~[spring-aop-5.3.23.jar:5.3.23]
    at glossar.service.GlossarService$$EnhancerBySpringCGLIB$$f55a2a7e.begriff(<generated>) ~[main/:na]
    at glossar.GlossarApplication.lambda$start$2(GlossarApplication.java:43) ~[main/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) ~[spring-boot-2.7.5.jar:2.7.5]
    ... 5 common frames omitted
Caused by: org.postgresql.util.PSQLException: ERROR: cannot execute SELECT FOR SHARE in a read-only transaction
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2675) ~[postgresql-42.3.7.jar:42.3.7]
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2365) ~[postgresql-42.3.7.jar:42.3.7]
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:355) ~[postgresql-42.3.7.jar:42.3.7]
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:490) ~[postgresql-42.3.7.jar:42.3.7]
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:408) ~[postgresql-42.3.7.jar:42.3.7]
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:167) ~[postgresql-42.3.7.jar:42.3.7]
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:119) ~[postgresql-42.3.7.jar:42.3.7]
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-4.0.3.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na]
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:722) ~[spring-jdbc-5.3.23.jar:5.3.23]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) ~[spring-jdbc-5.3.23.jar:5.3.23]
    ... 48 common frames omitted


Process finished with exit code 1
 

Mariexshhx

Bekanntes Mitglied
Also du musst ZUSÄTZLICH zu start noch die Zeilen hinzufügen und join schreiben. Man müsste sich mit den Antworten auch eine minimale Zeit beschäftigen... Hmm. Der schreibt ich soll quellcode hinzufügen. Was macht er wohl?!?

Ich verstehe auch nicht, wieso man Screenshots davon macht, statt hier den Text zu posten ;). Meine Antworten sind ja auch keine Screenshots von URLS.

Die neue Fehlermeldung ist ja auf dem Bild abgeschnitten.
sorry hier die ganze Fehlermeldung kommt leider auch wenn ich start und join beim Thread nutze. Jedoch scheint es jetzt zu einem Deadlock zu kommen
 

Marinek

Bekanntes Mitglied
Also, wenn man sich mit Pesimistic Locking beschäftigt, dann ist das wichtigste, dass man sich Gedanken zu Deadlock Situationen macht.

Die Datenbank weist dich darauf hin, dass du einen Deadlock hast.

Das führt zu einer Exception, den das Programm beendet. Das führt dazu, dass der Threadpool termininiert wird, das führt dazu, dass die Verbindung zur Datenbank beendet wird. Das wiederrum könnte zu unvorhergesehenen Komplikationen führen.

Kümemre dich zunächst um den Deadlock.
 

Mariexshhx

Bekanntes Mitglied
Also, wenn man sich mit Pesimistic Locking beschäftigt, dann ist das wichtigste, dass man sich Gedanken zu Deadlock Situationen macht.

Die Datenbank weist dich darauf hin, dass du einen Deadlock hast.

Das führt zu einer Exception, den das Programm beendet. Das führt dazu, dass der Threadpool termininiert wird, das führt dazu, dass die Verbindung zur Datenbank beendet wird. Das wiederrum könnte zu unvorhergesehenen Komplikationen führen.

Kümemre dich zunächst um den Deadlock.
Problem ist ich weiß nicht,wieso es zu einem Deadlock kommt normal wollen ja beide Threads auf den selben Datensatz zugrifen. Eig sollten die Threads nicht gegenseitig aufeinander warten was ja den Deadlock erklären würde
 

Ähnliche Java Themen

Neue Themen


Oben