Это обновление заставило меня исправить несколько зависимостей, в частности: < /p>
- Обновление Hibernate от v5.x.x < /code> к v6.6.8-final < /code> < /li>
Перемещение от Javax to Jakarta ee
по умолчанию (и в моем сценарии производства - документация здесь) эта сохраненная процедура должна выполняться внутри транзакции.
только для завершения, я завернут эту хранимую процедуру внутри другой, только для управления возвращенным кодом состояния, определение ниже: < /p>
Код: Выделить всё
CREATE PROCEDURE sp_getapplock_wrapper @Resource NVARCHAR(255), @LockMode NVARCHAR(32), @LockTimeout as INT, @Result INT OUTPUT
AS
BEGIN
EXEC @Result = Sp_getapplock @Resource = @Resource, @LockMode = @LockMode, @LockTimeout = @LockTimeout;
END;
< /code>
После обновления приложения любое призыв к этой хранимой процедуре возвращает код ошибки -999 < /code>, не позволяя заблокировать базу данных.
Если я попытаюсь изменить @ Lockowner от «транзакции» до «сеанса», все работает нормально (поэтому для меня это говорит о том, что проблема должна быть на уровне транзакции). < /P>
Анализирование журналов, это швои, что транзакция правильно открыт как на Java, так и на стороне базы данных: < /p>
[nio-8081-exec-1] o.s.orm.jpa.JpaTransactionManager : Creating new transaction with name [com.extoxesses.poc.core.service.CoreService.startProcess]: PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE
[nio-8081-exec-1] .i.SessionFactoryImpl$SessionBuilderImpl : Opening Hibernate Session. tenant=null
[nio-8081-exec-1] o.h.r.j.i.LogicalConnectionManagedImpl : `hibernate.connection.provider_disables_autocommit` was enabled. This setting should only be enabled when you are certain that the Connections given to Hibernate by the ConnectionProvider have auto-commit disabled. Enabling this setting when the Connections do not have auto-commit disabled will lead to Hibernate executing SQL operations outside of any JDBC/SQL transaction.
[nio-8081-exec-1] org.hibernate.internal.SessionImpl : Opened Session [42330797-b6ac-4444-b8ed-edddb2d47029] at timestamp: 1740480200789
[nio-8081-exec-1] o.s.orm.jpa.JpaTransactionManager : Opened new EntityManager [SessionImpl(4729152PersistenceContext[entityKeys=[], collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])] for JPA transaction
[nio-8081-exec-1] o.h.e.t.internal.TransactionImpl : On TransactionImpl creation, JpaCompliance#isJpaTransactionComplianceEnabled == false
[nio-8081-exec-1] o.h.e.t.internal.TransactionImpl : begin
[nio-8081-exec-1] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#afterBeginCallback
[nio-8081-exec-1] o.s.orm.jpa.JpaTransactionManager : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@71b08367]
< /code>
Вызов сохраненной процедуры является правильным: < /p>
[nio-8081-exec-1] c.e.poc.core.service.LockService : Acquiring lock for id id
[nio-8081-exec-1] o.h.p.internal.ProcedureCallImpl : Preparing procedure call : org.hibernate.sql.exec.internal.JdbcCallImpl@3b078a57
[nio-8081-exec-1] org.hibernate.SQL :
{call sp_getapplock_wrapper(?, ?, ?, ?)}
Hibernate:
{call sp_getapplock_wrapper(?, ?, ?, ?)}
[nio-8081-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl : Registering statement [HikariProxyCallableStatement@1877695894 wrapping sp_executesql SQL: null]
[nio-8081-exec-1] org.hibernate.orm.jdbc.bind : binding parameter (1:VARCHAR)
Подробнее здесь: [url]https://stackoverflow.com/questions/79466493/sql-server-transaction-management-via-springboot-3-and-hibernate-6[/url]