2015-04-27 66 views
3

我已經在谷歌環視了這個,但找不到任何相關的東西。基本上,我想要掌握長時間運行的交易。使用jdbc/hibernate獲取當前數據庫事務ID?

現在,我經歷information_schema.INNODB_TRX或看看的show engine innodb status輸出找到trx_id,然後打開general_logs看看有什麼疑問正在運行。

有沒有辦法,我可以在我的代碼中使用jdbchibernate來獲得這個transaction_id,這樣我就可以將其記錄在我的服務器日誌中了?

回答

2

在PostgreSQL,你可以簡單地運行這個本地查詢來獲取當前事務ID:

Number transactionId = (Number) session 
    .createSQLQuery("select txid_current()") 
    .uniqueResult(); 

對於MySQL,you need to run 5.7 or later

Number transactionId = (Number) session 
    .createSQLQuery(
      "SELECT GTID " + 
      "FROM events_transactions_current e " + 
      "JOIN performance_schema.threads t ON e.THREAD_ID = t.THREAD_ID " + 
      "WHERE t.PROCESSLIST_ID = CONNECTION_ID()") 
    .uniqueResult(); 

或爲MySQL 5.5:

Number transactionId = (Number) session 
    .createSQLQuery(
      "SELECT trx_id " + 
      "FROM information_schema.innodb_trx " + 
      "WHERE trx_mysql_thread_id = CONNECTION_ID()") 
    .uniqueResult(); 
+0

'INNODB_TRX'給出所有活動事務。我需要獲得當前的交易。 –