Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để lấy id giao dịch cơ sở dữ liệu hiện tại bằng JDBC hoặc Hibernate?

Oracle

Khi sử dụng Oracle, bạn phải thực hiện truy vấn SQL sau:

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

Giao dịch v$transaction khung nhìn cung cấp thông tin về các giao dịch cơ sở dữ liệu hiện đang chạy. Tuy nhiên, có thể có nhiều giao dịch đang chạy trong hệ thống của chúng tôi và đó là lý do tại sao chúng tôi tham gia v$transaction với v$session xem.

Phiên v$transaction xem cung cấp thông tin về phiên hiện tại hoặc kết nối cơ sở dữ liệu của chúng tôi. Bằng cách khớp địa chỉ phiên giữa v$transactionv$session xem, chúng tôi có thể tìm thấy mã nhận dạng giao dịch đang chạy hiện tại được cung cấp bởi xid trong cột v$transaction xem.

Bởi vì xid cột thuộc loại RAW , chúng tôi đang sử dụng RAWTOHEX để chuyển đổi giá trị nhị phân của mã định danh giao dịch thành biểu diễn thập lục phân của nó.

Máy chủ SQL

Khi sử dụng SQL Server, bạn chỉ cần thực hiện truy vấn SQL sau:

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

CURRENT_TRANSACTION_ID hàm trả về một BIGINT giá trị cột, chúng tôi đang sử dụng CONVERT để có được biểu diễn Chuỗi của nó.

PostgreSQL

Khi sử dụng Máy chủ PostgreSQL, bạn có thể thực hiện truy vấn SQL sau để lấy id giao dịch hiện tại:

SELECT CAST(txid_current() AS text)

Bởi vì txid_current hàm trả về một BIGINT giá trị cột, chúng tôi đang sử dụng CAST để có được biểu diễn Chuỗi của nó.

MySQL và MariaDB

Khi sử dụng MySQL hoặc MariaDB, bạn có thể thực hiện truy vấn SQL sau để lấy id giao dịch hiện tại:

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

innodb_trx xem trong information_schema danh mục cung cấp thông tin về các giao dịch cơ sở dữ liệu hiện đang chạy. Vì có thể có nhiều giao dịch đang chạy trong hệ thống của chúng tôi, chúng tôi cần lọc các hàng giao dịch bằng cách khớp phiên hoặc mã định danh kết nối cơ sở dữ liệu với phiên hiện đang chạy.

HSQLDB

Khi sử dụng cơ sở dữ liệu HyperSQL, bạn có thể thực hiện truy vấn SQL sau để lấy id giao dịch hiện tại:

VALUES (TRANSACTION_ID())

Ghi lại id giao dịch bằng MDC

Id giao dịch hữu ích cho việc ghi nhật ký vì nó cho phép chúng tôi tổng hợp tất cả các hành động đã được thực hiện trong ngữ cảnh của một giao dịch cơ sở dữ liệu nhất định.

Giả sử chúng ta đã đóng gói các truy vấn SQL ở trên trong một transactionId , chúng tôi có thể trích xuất id giao dịch hiện tại và chuyển nó vào khung Logger dưới dạng biến MDC.

Vì vậy, đối với SLF4J, bạn có thể sử dụng put như được minh họa bằng ví dụ sau:

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

MDC (Ngữ cảnh chẩn đoán được ánh xạ) là để ghi nhật ký cái gì ThreadLocal là các luồng Java. Về cơ bản, MDC cho phép bạn đăng ký các cặp khóa / giá trị được giới hạn trong chuỗi hiện đang chạy và bạn có thể tham chiếu khi khung ghi nhật ký xây dựng thông báo nhật ký.

Để in biến nhật ký "txId" vào nhật ký, chúng ta cần đưa biến này vào mẫu trình duyệt nhật ký:

<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} mẫu được sử dụng để tham chiếu txId biến nhật ký.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dường như không thể CHỈNH SỬA / SỬA ĐỔI bảng php của tôi theo id

  2. Truy vấn cơ sở dữ liệu phân biệt chữ hoa chữ thường

  3. Kết nối MySQL qua đường hầm SSH - làm thế nào để chỉ định máy chủ MySQL khác?

  4. mysql nếu không tồn tại

  5. Làm thế nào để triển khai bộ đệm ẩn sau ghi nền / không đồng bộ trong PHP?