Skip to content

Commit

Permalink
via a pre-connection detect real transaction-isolation variable name
Browse files Browse the repository at this point in the history
  • Loading branch information
blylei committed Apr 17, 2024
1 parent 8d99e46 commit a3d2a94
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
4 changes: 3 additions & 1 deletion go/mysql/connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,14 +136,16 @@ 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),
}
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, "&"))
}
21 changes: 21 additions & 0 deletions go/mysql/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(`
Expand Down

0 comments on commit a3d2a94

Please sign in to comment.