Skip to content

Timeout trying to lock table / Unique key violation while searching for number twice #216

@r15ch13

Description

@r15ch13

While searching for a number, I hit search two times because it took a bit longer to load.
My guess, the first request inserted the number into the database, while the second request searched for the number, but didn't get a result from the database. So it also tried to insert it.

The first time I got this error with a unique key violation, but after trying to replicate it I only got the Timeout trying to lock table error.

HTTP Status 500 – Internal Server Error
Type Exception Report

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: org.h2.jdbc.JdbcSQLTimeoutException: Timeout trying to lock table {0}; SQL statement:
insert into NUMBERS (PHONE, SHA1, ADDED, LASTMETA) values (?, ?, ?, ?) [50200-232]
### The error may exist in de/haumacher/phoneblock/db/SpamReports.java (best guess)
### The error may involve de.haumacher.phoneblock.db.SpamReports.insertLastMetaSearch-Inline
### The error occurred while setting parameters
### SQL: insert into NUMBERS (PHONE, SHA1, ADDED, LASTMETA) values (?, ?, ?, ?)
### Cause: org.h2.jdbc.JdbcSQLTimeoutException: Timeout trying to lock table {0}; SQL statement:
insert into NUMBERS (PHONE, SHA1, ADDED, LASTMETA) values (?, ?, ?, ?) [50200-232]
	org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:199)
	org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
	org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
	org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
	org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
	jdk.proxy25/jdk.proxy25.$Proxy231.insertLastMetaSearch(Unknown Source)
	de.haumacher.phoneblock.meta.SearchOperation.shouldSearch(SearchOperation.java:152)
	de.haumacher.phoneblock.meta.SearchOperation.search(SearchOperation.java:81)
	de.haumacher.phoneblock.meta.MetaSearchService.fetchComments(MetaSearchService.java:145)
	de.haumacher.phoneblock.app.SearchServlet.analyzeDb(SearchServlet.java:360)
	de.haumacher.phoneblock.app.SearchServlet.doGet(SearchServlet.java:298)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	de.haumacher.phoneblock.app.CacheControlFilter.doFilter(CacheControlFilter.java:46)
	de.haumacher.phoneblock.app.ContentSecurityPolicyFilter.doFilter(ContentSecurityPolicyFilter.java:24)
	de.haumacher.phoneblock.app.ContentTypeOptionFilter.doFilter(ContentTypeOptionFilter.java:27)
	de.haumacher.phoneblock.app.render.ContentFilter.render(ContentFilter.java:306)
	de.haumacher.phoneblock.app.render.ContentFilter.requestLogin(ContentFilter.java:165)
	de.haumacher.phoneblock.app.LoginFilter.doFilter(LoginFilter.java:134)
	de.haumacher.phoneblock.app.render.ContentFilter.doFilter(ContentFilter.java:128)
Root Cause

org.h2.jdbc.JdbcSQLTimeoutException: Timeout trying to lock table {0}; SQL statement:
insert into NUMBERS (PHONE, SHA1, ADDED, LASTMETA) values (?, ?, ?, ?) [50200-232]
	org.h2.message.DbException.getJdbcSQLException(DbException.java:572)
	org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
	org.h2.message.DbException.get(DbException.java:212)
	org.h2.command.Command.filterConcurrentUpdate(Command.java:375)
	org.h2.command.Command.executeUpdate(Command.java:310)
	org.h2.command.Command.executeUpdate(Command.java:248)
	org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:262)
	org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48)
	org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75)
	org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
	org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
	org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
	org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
	org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
	org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
	org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
	org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
	jdk.proxy25/jdk.proxy25.$Proxy231.insertLastMetaSearch(Unknown Source)
	de.haumacher.phoneblock.meta.SearchOperation.shouldSearch(SearchOperation.java:152)
	de.haumacher.phoneblock.meta.SearchOperation.search(SearchOperation.java:81)
	de.haumacher.phoneblock.meta.MetaSearchService.fetchComments(MetaSearchService.java:145)
	de.haumacher.phoneblock.app.SearchServlet.analyzeDb(SearchServlet.java:360)
	de.haumacher.phoneblock.app.SearchServlet.doGet(SearchServlet.java:298)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	de.haumacher.phoneblock.app.CacheControlFilter.doFilter(CacheControlFilter.java:46)
	de.haumacher.phoneblock.app.ContentSecurityPolicyFilter.doFilter(ContentSecurityPolicyFilter.java:24)
	de.haumacher.phoneblock.app.ContentTypeOptionFilter.doFilter(ContentTypeOptionFilter.java:27)
	de.haumacher.phoneblock.app.render.ContentFilter.render(ContentFilter.java:306)
	de.haumacher.phoneblock.app.render.ContentFilter.requestLogin(ContentFilter.java:165)
	de.haumacher.phoneblock.app.LoginFilter.doFilter(LoginFilter.java:134)
	de.haumacher.phoneblock.app.render.ContentFilter.doFilter(ContentFilter.java:128)
Root Cause

org.h2.message.DbException: Concurrent update in table "NUMBERS": another transaction has updated or deleted the same row [90131-232]
	org.h2.message.DbException.get(DbException.java:223)
	org.h2.message.DbException.get(DbException.java:199)
	org.h2.mvstore.db.MVSecondaryIndex.checkUnique(MVSecondaryIndex.java:225)
	org.h2.mvstore.db.MVSecondaryIndex.add(MVSecondaryIndex.java:184)
	org.h2.mvstore.db.MVTable.addRow(MVTable.java:517)
	org.h2.command.dml.Insert.insertRows(Insert.java:174)
	org.h2.command.dml.Insert.update(Insert.java:135)
	org.h2.command.dml.DataChangeStatement.update(DataChangeStatement.java:74)
	org.h2.command.CommandContainer.update(CommandContainer.java:139)
	org.h2.command.Command.executeUpdate(Command.java:304)
	org.h2.command.Command.executeUpdate(Command.java:248)
	org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:262)
	org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48)
	org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75)
	org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
	org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
	org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
	org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
	org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
	org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
	org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
	org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
	jdk.proxy25/jdk.proxy25.$Proxy231.insertLastMetaSearch(Unknown Source)
	de.haumacher.phoneblock.meta.SearchOperation.shouldSearch(SearchOperation.java:152)
	de.haumacher.phoneblock.meta.SearchOperation.search(SearchOperation.java:81)
	de.haumacher.phoneblock.meta.MetaSearchService.fetchComments(MetaSearchService.java:145)
	de.haumacher.phoneblock.app.SearchServlet.analyzeDb(SearchServlet.java:360)
	de.haumacher.phoneblock.app.SearchServlet.doGet(SearchServlet.java:298)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	de.haumacher.phoneblock.app.CacheControlFilter.doFilter(CacheControlFilter.java:46)
	de.haumacher.phoneblock.app.ContentSecurityPolicyFilter.doFilter(ContentSecurityPolicyFilter.java:24)
	de.haumacher.phoneblock.app.ContentTypeOptionFilter.doFilter(ContentTypeOptionFilter.java:27)
	de.haumacher.phoneblock.app.render.ContentFilter.render(ContentFilter.java:306)
	de.haumacher.phoneblock.app.render.ContentFilter.requestLogin(ContentFilter.java:165)
	de.haumacher.phoneblock.app.LoginFilter.doFilter(LoginFilter.java:134)
	de.haumacher.phoneblock.app.render.ContentFilter.doFilter(ContentFilter.java:128)
Root Cause

org.h2.jdbc.JdbcSQLTransientException: Concurrent update in table "NUMBERS": another transaction has updated or deleted the same row [90131-232]
	org.h2.message.DbException.getJdbcSQLException(DbException.java:694)
	org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
	org.h2.message.DbException.get(DbException.java:223)
	org.h2.message.DbException.get(DbException.java:199)
	org.h2.mvstore.db.MVSecondaryIndex.checkUnique(MVSecondaryIndex.java:225)
	org.h2.mvstore.db.MVSecondaryIndex.add(MVSecondaryIndex.java:184)
	org.h2.mvstore.db.MVTable.addRow(MVTable.java:517)
	org.h2.command.dml.Insert.insertRows(Insert.java:174)
	org.h2.command.dml.Insert.update(Insert.java:135)
	org.h2.command.dml.DataChangeStatement.update(DataChangeStatement.java:74)
	org.h2.command.CommandContainer.update(CommandContainer.java:139)
	org.h2.command.Command.executeUpdate(Command.java:304)
	org.h2.command.Command.executeUpdate(Command.java:248)
	org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:262)
	org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48)
	org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75)
	org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
	org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
	org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
	org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
	org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
	org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
	org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
	org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
	jdk.proxy25/jdk.proxy25.$Proxy231.insertLastMetaSearch(Unknown Source)
	de.haumacher.phoneblock.meta.SearchOperation.shouldSearch(SearchOperation.java:152)
	de.haumacher.phoneblock.meta.SearchOperation.search(SearchOperation.java:81)
	de.haumacher.phoneblock.meta.MetaSearchService.fetchComments(MetaSearchService.java:145)
	de.haumacher.phoneblock.app.SearchServlet.analyzeDb(SearchServlet.java:360)
	de.haumacher.phoneblock.app.SearchServlet.doGet(SearchServlet.java:298)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	de.haumacher.phoneblock.app.CacheControlFilter.doFilter(CacheControlFilter.java:46)
	de.haumacher.phoneblock.app.ContentSecurityPolicyFilter.doFilter(ContentSecurityPolicyFilter.java:24)
	de.haumacher.phoneblock.app.ContentTypeOptionFilter.doFilter(ContentTypeOptionFilter.java:27)
	de.haumacher.phoneblock.app.render.ContentFilter.render(ContentFilter.java:306)
	de.haumacher.phoneblock.app.render.ContentFilter.requestLogin(ContentFilter.java:165)
	de.haumacher.phoneblock.app.LoginFilter.doFilter(LoginFilter.java:134)
	de.haumacher.phoneblock.app.render.ContentFilter.doFilter(ContentFilter.java:128)
Note The full stack trace of the root cause is available in the server logs.

Apache Tomcat/10.1.16 (Ubuntu)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions