Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да получите текущия идентификатор на транзакция в базата данни с помощта на JDBC или Hibernate?

Оракул

Когато използвате Oracle, трябва да изпълните следната SQL заявка:

SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr

v$transaction view предоставя информация за текущо изпълняваните транзакции на база данни. Въпреки това, в нашата система може да се изпълняват множество транзакции и затова се присъединяваме към v$transaction с v$session преглед.

v$session view предлага информация за нашата текуща сесия или връзка с база данни. Чрез съпоставяне на адреса на сесията между v$transaction и v$session изгледи, можем да намерим текущия идентификатор на текущата транзакция, даден от xid колона в v$transaction преглед.

Тъй като xid колоната е от тип RAW , ние използваме RAWTOHEX за да преобразувате двоичната стойност на идентификатора на транзакцията в шестнадесетичното й представяне.

SQL сървър

Когато използвате SQL Server, просто трябва да изпълните следната SQL заявка:

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

Тъй като CURRENT_TRANSACTION_ID функцията връща BIGINT стойност на колоната, ние използваме CONVERT за да получите неговото низово представяне.

PostgreSQL

Когато използвате PostgreSQL Server, можете да изпълните следната SQL заявка, за да получите текущия идентификатор на транзакцията:

SELECT CAST(txid_current() AS text)

Тъй като txid_current функцията връща BIGINT стойност на колоната, ние използваме CAST за да получите неговото низово представяне.

MySQL и MariaDB

Когато използвате MySQL или MariaDB, можете да изпълните следната SQL заявка, за да получите текущия идентификатор на транзакцията:

SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()

innodb_trx преглед в information_schema каталог предоставя информация за текущо изпълняваните транзакции на база данни. Тъй като в нашата система може да има множество транзакции, трябва да филтрираме редовете за транзакции, като съпоставим идентификатора на връзката на сесията или базата данни с текущата сесия.

HSQLDB

Когато използвате базата данни HyperSQL, можете да изпълните следната SQL заявка, за да получите текущия идентификатор на транзакцията:

VALUES (TRANSACTION_ID())

Регистриране на идентификатора на транзакцията чрез MDC

Идентификаторът на транзакцията е полезен за регистриране, тъй като ни позволява да обобщим всички действия, които са били изпълнени в контекста на дадена транзакция в базата данни.

Ако приемем, че сме капсулирали SQL заявките по-горе в transactionId метод, можем да извлечем текущия идентификатор на транзакцията и да го предадем на рамката на Logger като MDC променлива.

Така че за SLF4J можете да използвате put метод, както е илюстрирано от следния пример:

MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));

MDC (картографиран диагностичен контекст) е за регистриране на това, което ThreadLocal е към нишките на Java. По принцип MDC ви позволява да регистрирате двойки ключ/стойност, които са ограничени до текущата нишка и които можете да препратите, когато рамката за регистриране изгражда регистрационни съобщения.

За да отпечатате регистрационната променлива "txId" в дневника, трябва да включим тази променлива в шаблона за добавяне на дневник:

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>TRACE</level>
    </filter>
    <encoder>
        <Pattern>%-5p [%t]:%X{txId} %c{1} - %m%n</Pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

%X{txId} шаблонът се използва за препратка към txId log променлива.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Командният изход на MySQL е твърде широк в клиента на командния ред

  2. MYSQL:Където клаузата е двусмислена

  3. Търсете телефонен номер от MYSQL DB

  4. PHP:mysql v mysqli v pdo

  5. Използване на MySQL GROUP_CONCAT или PIVOT върху множество свързани таблици