From a3d2a94303d74cebaae2f55834f1d03ff39a423e Mon Sep 17 00:00:00 2001 From: blylei Date: Wed, 17 Apr 2024 22:43:26 +0800 Subject: [PATCH] via a pre-connection detect real transaction-isolation variable name --- go/mysql/connection.go | 4 +++- go/mysql/utils.go | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/go/mysql/connection.go b/go/mysql/connection.go index 7db51afe4..f125492b4 100644 --- a/go/mysql/connection.go +++ b/go/mysql/connection.go @@ -136,7 +136,6 @@ func (this *ConnectionConfig) GetDBUri(databaseName string) string { "interpolateParams=true", fmt.Sprintf("charset=%s", this.Charset), fmt.Sprintf("tls=%s", tlsOption), - fmt.Sprintf("transaction_isolation=%q", this.TransactionIsolation), fmt.Sprintf("timeout=%fs", this.Timeout), fmt.Sprintf("readTimeout=%fs", this.Timeout), fmt.Sprintf("writeTimeout=%fs", this.Timeout), @@ -144,6 +143,9 @@ func (this *ConnectionConfig) GetDBUri(databaseName string) string { if this.WaitTimeout > 0 { connectionParams = append(connectionParams, fmt.Sprintf("wait_timeout=%fs", this.WaitTimeout)) } + tmpDsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/mysql?", this.User, this.Password, hostname, this.Key.Port) + TrxName := GetTrxVariableName(tmpDsn) + connectionParams = append(connectionParams, fmt.Sprintf("%s=%q", TrxName, this.TransactionIsolation)) return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", this.User, this.Password, hostname, this.Key.Port, databaseName, strings.Join(connectionParams, "&")) } diff --git a/go/mysql/utils.go b/go/mysql/utils.go index c69a3f255..e6db3b531 100644 --- a/go/mysql/utils.go +++ b/go/mysql/utils.go @@ -175,6 +175,27 @@ func GetInstanceKey(db *gosql.DB) (instanceKey *InstanceKey, err error) { return instanceKey, err } +// GetTrxVariableName get real transaction_isolation via a pre-connection, transaction_isolation or tx_isolation +func GetTrxVariableName(dsn string) string { + var trxVariableName string + const ( + transactionIsolation string = "transaction_isolation" + txIsolation string = "tx_isolation" + ) + query := fmt.Sprintf("select @@%s;", txIsolation) + db, err := gosql.Open("mysql", dsn) + defer func() { + db.Close() + }() + if err != nil { + return "" + } + if err := db.QueryRow(query).Scan(&trxVariableName); err == nil { + return txIsolation + } + return transactionIsolation +} + // GetTableColumns reads column list from given table func GetTableColumns(db *gosql.DB, databaseName, tableName string) (*sql.ColumnList, *sql.ColumnList, error) { query := fmt.Sprintf(`