{"record":{"id":"689c0b3f798746cb","repo":"apache/dolphinscheduler","slug":"10093","errorCode":"10093","errorMessage":"delete user by id error","messagePattern":"delete user by id error","errorType":"error_code","errorClass":"ServiceException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java","lineNumber":452,"sourceCode":"            throw new ServiceException(Status.USER_NOT_EXIST, id);\n        }\n        // check if is a project owner\n        List<Project> projects = projectDao.queryProjectCreatedByUser(id);\n        if (CollectionUtils.isNotEmpty(projects)) {\n            String projectNames = projects.stream().map(Project::getName).collect(Collectors.joining(\",\"));\n            log.warn(\"Please transfer the project ownership before deleting the user, userId:{}, projects:{}.\", id,\n                    projectNames);\n            throw new ServiceException(Status.TRANSFORM_PROJECT_OWNERSHIP, projectNames);\n        }\n        // delete user\n        userDao.queryTenantCodeByUserId(id);\n\n        accessTokenDao.deleteByUserId(id);\n        sessionService.expireSession(id);\n\n        if (!userDao.deleteById(id)) {\n            log.error(\"User delete error, userId:{}.\", id);\n            throw new ServiceException(Status.DELETE_USER_BY_ID_ERROR);\n        }\n        log.info(\"User is deleted and id is :{}.\", id);\n    }\n\n    /**\n     * revoke the project permission for specified user by id\n     *\n     * @param loginUser  Login user\n     * @param userId     User id\n     * @param projectIds project id array\n     * @return\n     */\n    @Override\n    @Transactional(rollbackFor = RuntimeException.class)\n    public void revokeProjectById(User loginUser, int userId, String projectIds) {\n        // 1. only admin can operate\n        if (!this.isAdmin(loginUser)) {\n            throw new ServiceException(Status.USER_NO_OPERATION_PERM);","sourceCodeStart":434,"sourceCodeEnd":470,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java#L434-L470","documentation":"Thrown by UsersServiceImpl.deleteUserById when userDao.deleteById(id) returns false after the access tokens and sessions were already removed. Code DELETE_USER_BY_ID_ERROR (10093) signals the final row deletion did not succeed (zero rows affected or DB failure).","triggerScenarios":"The user row vanished concurrently before deleteById ran; database connectivity/transaction issue; FK constraints causing the delete to fail silently at the DAO layer.","commonSituations":"Concurrent admin operations deleting the same user; database under duress (locks, timeouts); environments with orphaned references blocking the delete.","solutions":["Check API server logs for 'User delete error' and the underlying DB error","Confirm whether the user was actually deleted (query t_ds_user) and retry only if it still exists","Inspect foreign-key references (relations, schedules) that may block deletion","Retry after resolving database connectivity issues; the transaction will roll back token/session deletion"],"exampleFix":"// before\nuserDao.deleteById(id); // unchecked result\n// after\nif (!userDao.deleteById(id)) {\n    throw new ServiceException(Status.DELETE_USER_BY_ID_ERROR);\n}","handlingStrategy":"try-catch","validationCode":"if (userDao.queryById(id) == null) { throw new IllegalStateException(\"user missing before delete\"); }","typeGuard":null,"tryCatchPattern":"try { userService.deleteUserById(loginUser, id); } catch (ServiceException e) { if (e.getCode() == 10093) { investigateDbAndMaybeRetry(e); } }","preventionTips":["Avoid concurrent deletion of the same user","Check API/DB logs for the root SQL failure","Clean up dependent rows (relations, schedules) that may block the delete"],"tags":["database","user-management","persistence"],"backgroundTag":"database-write-failed","analyzedSha":"02eac45a1b6676e639fcbfb4be2243de5771b05d","analyzedAt":"2026-09-06T17:43:00.555Z","contentChangedAt":"2026-09-06T17:43:00.555Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}