JPA: откат транзакции не работает - PullRequest
0 голосов
/ 03 мая 2018

Мой код на самом деле огромен, так что вот код. Я пытаюсь сохранить потоки набора файлов в базе данных в одной транзакции, и эта транзакция фиксируется.

Вскоре после того, как я использую ту же транзакцию, переписываю потоки файлов в базе данных и другие данные вместе с ней. Поэтому я снова начинаю ту же транзакцию и фиксирую ее после завершения этого процесса. Но в случае исключений транзакция не откатывается и база данных обновляется новыми значениями. Что может быть причиной этого?

Пожалуйста, помогите и спасибо заранее.

try {
            Map<String, String> constants = AppConstants.getAppConstants();
            String hrEmailIds = constants.get(FileUploadDownloadConstants.HR_EMAIL);

            entityManager.getTransaction().begin();
            fileDao.setEmployeekeychangestatus(employeeID, KeyChangeJobStatus.STARTED.getValue());
            entityManager.getTransaction().commit();
            entityManager.flush();

            setOldFileStreams(employeeID);

            List <Integer>tempFileIds = fileDao.getTempFileIds(employeeID);
            entityManager.clear();

            KeyPair keyPair = cryptographyHelper.getKeyPairs();
            PublicKey newPublicKey = keyPair.getPublic();
            PrivateKey newPrivateKey = keyPair.getPrivate();
            PrivateKey oldPrivateKey = job.getPrivateKey();
            Tempfile tempFile;
            ByteArrayOutputStream fileEncryptedWithNewKey;

            for(int tempFileId : tempFileIds)
            {
                tempFile = fileDao.getTempFileById(tempFileId);
                fileEncryptedWithNewKey = decryptAndEncryptStream(tempFile, oldPrivateKey, newPublicKey);

                absolutePath = tempFile.getFilemetadata().getFilepath();
                path = absolutePath.substring(0,absolutePath.lastIndexOf(File.separator));
                fileDao.storeFile(fileEncryptedWithNewKey, path, tempFile.getFilemetadata().getFilename());
                fileCompletionCount++;
                fileEncryptedWithNewKey.close();
                entityManager.clear();

                intkeyChangeProgress = findPercentage(fileCompletionCount,numberOfFiles,FileUploadDownloadConstants.PRECENTAGE_TO_UPDATE_FILE_STREAM);
                intkeyChangeProgress += FileUploadDownloadConstants.PRECENTAGE_TO_SET_OLD_FILE_STREAMS;
                EmployeeOperationStatus.putEmployeeKeyChangeProgress(employeeID,intkeyChangeProgress);
            }

            intkeyChangeProgress = findPercentage(fileCompletionCount,numberOfFiles,FileUploadDownloadConstants.PRECENTAGE_TO_UPDATE_FILE_STREAM);
            intkeyChangeProgress += FileUploadDownloadConstants.PRECENTAGE_TO_SET_OLD_FILE_STREAMS;
            EmployeeOperationStatus.putEmployeeKeyChangeProgress(employeeID,intkeyChangeProgress);

            entityManager.getTransaction().begin();

            fileDao.deleteTempFilesForEmployee(employeeID);


            ByteArrayOutputStream byteEncryptedPrvateKey = encryptKey(employeeID, newPrivateKey);
            constants = AppConstants.getAppConstants();
            String privateKeyPath = constants.get(FileUploadDownloadConstants.BASE_PRIVATE_KEY_FILE_PATH);

            employee = fileDao.getEmployee(employeeID);
            keyDao.updatePublicKey(employee, newPublicKey);

            fileDao.removeEmployeekeychangestatus(employeeID);

            fileDao.storeFile(byteEncryptedPrvateKey, privateKeyPath, employee.getUserid()+FileUploadDownloadConstants.PRIVATE_KEY_EXTENSION);
            privateKeyByteArray = cryptographyHelper.getPrivateKeyBytes(newPrivateKey);
            mailingService.sendMailForKeyNotification(employee.getEmail(), hrEmailIds, privateKeyByteArray, 
                    employee.getUserid()+FileUploadDownloadConstants.PRIVATE_KEY_EXTENSION, FileUploadDownloadConstants.CHANGE_KEY);

            entityManager.getTransaction().commit();
            entityManager.clear();

        } catch (EmprisException e) {
              e.printStackTrace();
              entityManager.getTransaction().rollback();

        } catch (Exception e ) {
             e.printStackTrace();
             entityManager.getTransaction().rollback();
        }
    }

1 Ответ

0 голосов
/ 03 мая 2018

У вас открыты две отдельные транзакции. Когда вторая транзакция вызывает исключение, первое исключение не отменяется, оно уже зафиксировано.

...