Source of error in logs: "Uncommitted database transaction detected. Closing..."

This message is appearing in the log in a Jira Server v7.5.3 instance. We have not seen it before. It appears after one of the package names within our add-on. But this particular package is not doing anything with transactions or the database directly. It is, however, using ComponentAccessor and various services retrieved through ComponentAccessor (SearchService, WorkLogManager, ChangeHistoryManager) to perform JQL-based searches and pull issue data. There are no other errors being reported and the message is not very specific… Does anyone have any tips for tracking down the source of this message? I was hoping to look in the Jira source code but I haven’t been able to find it.

Can you help us by providing more of the actual exception?

That’s the problem! There doesn’t seem to be an associated exception logged. Just this message. All I know is, it is not a message that our add-on is throwing on its own. Here’s an example:

2020-02-26 13:11:29,222 http-nio-8082-exec-50 url:/secure/WorkflowUIDispatcher.jspa username:admin ERROR admin 790x32577767x13 kvx94n 127.0.0.1 /secure/WorkflowUIDispatcher.jspa [c.m.utils.JiraUtils] Uncommitted database transaction detected.  Closing...

There are exceptions nearby in the log, but they seem unrelated. Here are two examples:

Exception occurred editing issue: java.lang.NullPointerException
java.lang.NullPointerException
	at com.atlassian.jira.plugin.viewissue.AttachmentBlockContextHelper$SessionParamProvider.getAttribute(AttachmentBlockContextHelper.java:161)
	at com.atlassian.jira.plugin.viewissue.AttachmentBlockContextHelper.getBackedRequestParam(AttachmentBlockContextHelper.java:96)
	at com.atlassian.jira.plugin.viewissue.AttachmentBlockContextHelper.getSessionBackedRequestParam(AttachmentBlockContextHelper.java:70)
	at com.atlassian.jira.plugin.viewissue.AttachmentBlockContextHelper.getAttachmentOrder(AttachmentBlockContextHelper.java:51)
	at com.atlassian.jira.plugin.viewissue.AttachmentBlockContentRenderingInstructionsProvider.getInstruction(AttachmentBlockContentRenderingInstructionsProvider.java:47)
	at com.atlassian.jira.components.issueviewer.viewissue.webpanel.DefaultContentRenderingInstructionProvider.get(DefaultContentRenderingInstructionProvider.java:37)
	at com.atlassian.jira.components.issueviewer.viewissue.webpanel.WebPanelMapperUtilImpl.mapAndRenderPanels(WebPanelMapperUtilImpl.java:95)
	at com.atlassian.jira.components.issueviewer.viewissue.webpanel.WebPanelMapperUtilImpl.create(WebPanelMapperUtilImpl.java:64)
	at com.atlassian.jira.components.issueviewer.action.AjaxIssueAction.populateIssueFields(AjaxIssueAction.java:161)
	at com.atlassian.jira.components.issueviewer.action.AjaxIssueAction.doExecute(AjaxIssueAction.java:249)
	... 1 filtered
	at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:63)
	... 7 filtered
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	... 19 filtered
	at com.softwareplant.ppm.structureint.jiraserver.event.PluginIssueLinkListener.doFilter(PluginIssueLinkListener.java:72)
	... 36 filtered
	at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:62)
	... 12 filtered
	at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
	... 45 filtered
	at com.almworks.jira.structure.util.servlet.AbstractStructureServletFilter.doHttpFilter(AbstractStructureServletFilter.java:46)
	at com.almworks.jira.structure.util.servlet.AbstractStructureServletFilter.doFilter(AbstractStructureServletFilter.java:34)
	... 3 filtered
	at com.almworks.jira.structure.event.interceptor.IssueLinksInterceptor.doHttpFilter(IssueLinksInterceptor.java:98)
	at com.almworks.jira.structure.util.servlet.AbstractStructureServletFilter.doFilter(AbstractStructureServletFilter.java:34)
	... 3 filtered
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.runWithChangedThreadName(AbstractThreadFilter.java:69)
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:53)
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:37)
	... 14 filtered
	at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66)
	... 1 filtered
	at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64)
	... 36 filtered
	at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30)
	... 10 filtered
	at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
	... 4 filtered
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.runWithChangedThreadName(AbstractThreadFilter.java:69)
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:53)
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:37)
	... 3 filtered
	at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:36)
	... 26 filtered
	at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25)
	... 23 filtered
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
An exception occured while rendering the web panel: com.atlassian.jira.jira-view-issue-plugin:activitymodule (null)
java.lang.NullPointerException
	at com.atlassian.jira.plugin.viewissue.ActivityBlockViewIssueContextProvider.getCurrentTabPanel(ActivityBlockViewIssueContextProvider.java:171)
	at com.atlassian.jira.plugin.viewissue.ActivityBlockViewIssueContextProvider.getContextMap(ActivityBlockViewIssueContextProvider.java:92)
	at com.atlassian.jira.plugin.webfragment.CacheableContextProviderDecorator.initContextMap(CacheableContextProviderDecorator.java:63)
	at com.atlassian.jira.plugin.webfragment.CacheableContextProviderDecorator.getContextMap(CacheableContextProviderDecorator.java:41)
	at com.atlassian.jira.plugin.webfragment.contextproviders.MultiContextProvider.getContextMap(MultiContextProvider.java:86)
	at com.atlassian.jira.plugin.bigpipe.BigPipeWebPanelModuleDescriptor$BigPipeDelegatingWebPanel.getHtml(BigPipeWebPanelModuleDescriptor.java:251)
	at com.atlassian.jira.web.component.ModuleWebComponentImpl.renderModule(ModuleWebComponentImpl.java:81)
	at com.atlassian.jira.web.component.ModuleWebComponentImpl.access$000(ModuleWebComponentImpl.java:30)
	at com.atlassian.jira.web.component.ModuleWebComponentImpl$1.run(ModuleWebComponentImpl.java:67)
	at com.atlassian.ozymandias.SafePluginPointAccess.runnable(SafePluginPointAccess.java:201)
	at com.atlassian.jira.web.component.ModuleWebComponentImpl.renderModuleAndLetNoThrowablesEscape(ModuleWebComponentImpl.java:63)
	at com.atlassian.jira.web.component.ModuleWebComponentImpl.renderModule(ModuleWebComponentImpl.java:53)
	... 2 filtered
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.atlassian.plugin.util.ContextClassLoaderSettingInvocationHandler.invoke(ContextClassLoaderSettingInvocationHandler.java:26)
	at com.sun.proxy.$Proxy231.renderModule(Unknown Source)
	... 2 filtered
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
	at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56)
	at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70)
	at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
	at com.sun.proxy.$Proxy3089.renderModule(Unknown Source)
	at com.atlassian.jira.issue.util.IssueWebPanelRenderUtil.renderHeadlessPanel(IssueWebPanelRenderUtil.java:90)
	at com.atlassian.jira.components.issueviewer.viewissue.webpanel.WebPanelMapperUtilImpl.mapAndRenderPanels(WebPanelMapperUtilImpl.java:113)
	at com.atlassian.jira.components.issueviewer.viewissue.webpanel.WebPanelMapperUtilImpl.create(WebPanelMapperUtilImpl.java:64)
	at com.atlassian.jira.components.issueviewer.action.AjaxIssueAction.populateIssueFields(AjaxIssueAction.java:161)
	at com.atlassian.jira.components.issueviewer.action.AjaxIssueAction.doExecute(AjaxIssueAction.java:249)
	... 1 filtered
	at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:63)
	... 7 filtered
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	... 19 filtered
	at com.softwareplant.ppm.structureint.jiraserver.event.PluginIssueLinkListener.doFilter(PluginIssueLinkListener.java:72)
	... 36 filtered
	at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:62)
	... 12 filtered
	at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
	... 45 filtered
	at com.almworks.jira.structure.util.servlet.AbstractStructureServletFilter.doHttpFilter(AbstractStructureServletFilter.java:46)
	at com.almworks.jira.structure.util.servlet.AbstractStructureServletFilter.doFilter(AbstractStructureServletFilter.java:34)
	... 3 filtered
	at com.almworks.jira.structure.event.interceptor.IssueLinksInterceptor.doHttpFilter(IssueLinksInterceptor.java:98)
	at com.almworks.jira.structure.util.servlet.AbstractStructureServletFilter.doFilter(AbstractStructureServletFilter.java:34)
	... 3 filtered
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.runWithChangedThreadName(AbstractThreadFilter.java:69)
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:53)
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:37)
	... 14 filtered
	at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66)
	... 1 filtered
	at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64)
	... 36 filtered
	at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30)
	... 10 filtered
	at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
	... 4 filtered
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.runWithChangedThreadName(AbstractThreadFilter.java:69)
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:53)
	at com.atlassian.ams.shipit.servlet.filter.AbstractThreadFilter.doFilter(AbstractThreadFilter.java:37)
	... 3 filtered
	at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:36)
	... 26 filtered
	at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25)
	... 23 filtered
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

Do you have any clue what this package is? The abbreviation is making it really hard for me too. I figured we could just look in that file but I suppose that’s the real problem here isn’t it. :slight_smile:

Yes, that is the package from our add-on, so I do have the full source code available :slight_smile: But as I mentioned in my first post, this particular package is not doing anything with transactions or the database directly. It is, however, using ComponentAccessor and various services retrieved through ComponentAccessor (SearchService, WorkLogManager, ChangeHistoryManager) to perform JQL-based searches and pull issue data… So I do not understand why/how it might be leading to uncommitted transaction messages, especially when no errors are being reported from the package itself.

Still looking, but this string exists within JiraThreadLocalUtils.java at line 139.

Interesting. So we are using that in the class that’s being referenced in the logs. But preCall() and postCall() are in use and I’m not seeing a way postCall() would get missed. SearchResult is just a simple class to hold a List of issues, result count, and result end number.

SearchService searchService = ComponentAccessor.getComponentOfType(SearchService.class);        
SearchService.ParseResult parseResult = searchService.parseQuery(null, jql);

PagerFilter<UserBrowserFilter> filter = new PagerFilter();
filter.setStart(startAt);
filter.setMax(1000);

SearchResult result = new SearchResult();

if (!parseResult.isValid()) {
    log.error("Could not parse query {}", jql);
    return result;
}

JiraThreadLocalUtils.preCall();
try {
    log.debug("Running query {}", parseResult.getQuery());
    SearchResults searchResults = searchService.searchOverrideSecurity(null, parseResult.getQuery(), filter);
    result.setResultCount(searchResults.getTotal());
    result.setEnd(searchResults.getEnd());
    
    try {
        Method newGetMethod = null; 
        
        try {
            newGetMethod = SearchResults.class.getMethod("getIssues");
        } catch (NoSuchMethodException e) {
            try {
                newGetMethod = SearchResults.class.getMethod("getResults");
            } catch (NoSuchMethodError e2) {
                log.error("SearchResults.getResults does not exist!");
            }
        }
        
        if (newGetMethod != null) {
            result.setIssues((List<Issue>) newGetMethod.invoke(searchResults));
        } else {
            log.error("No method exists to get get issues!");
        }
    } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
        log.error("Jql Helper can not get search result", e);
    } catch (Exception e) {
        log.error("Jql Helper can not get search result - other exception", e);
    }               
    log.debug("Search results: {}", result.getIssues().size());
} catch (Exception e) {
    log.error("Search exception encountered with query {}: {}", jql, e);
} finally {
    JiraThreadLocalUtils.postCall(LOGGER, null);
}

return result;

We are having the same problem when running post functions
/secure/WorkflowUIDispatcher.jspa [c.a.j.util.thread.JiraThreadLocalUtils] Uncommitted database transaction detected. Closing...

We have been analyzing and we realized that the error happens when we use the ThreadedJiraCall.run () method.
During execution, a process is created and saved in the database, but even using Transaction.commit () it is not writing in the database, it just remains in memory.

We already add JiraThreadLocalUtils.preCall() and JiraThreadLocalUtils.postCall() and still facing the error.