I am inserting records into a mysql table using  the function "SqliteToMysqlData" in my db class. This is the full code of the class:
Line 219 is where the sub starts. I am starting a transaction in line 283, inserting the rows, then commit the transaction in line 307
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
This Is what I see in the IDE Log, the START TRANSACTION AND THE COMMIT are listed BEFORE the actual insertion of the rows.
		
		
	
	
		
	
But this is what I see in the general_log table of the mysql server:
		
	
Everything looks fine there.
Why is the log displaying events out of order? Am I doing anything wrong?
			
			Line 219 is where the sub starts. I am starting a transaction in line 283, inserting the rows, then commit the transaction in line 307
			
				db class:
			
		
		
		Sub Class_Globals
    
    Public Kvs As KeyValueStore
    Public Sqlite As SQL
    Public Mysql As JdbcSQL
    
    Public EnableLog As Boolean = True
    
End Sub
Public Sub Initialize
    
    MysqlDisableStrictMode
    
    SqliteInit(False)
    
    KvsInit(False)
    
End Sub
Sub MysqlDisableStrictMode
    
    Private jo As JavaObject
    jo.InitializeStatic("android.os.Build.VERSION")
    If jo.GetField("SDK_INT") > 9 Then
        Private policy As JavaObject
        policy = policy.InitializeNewInstance("android.os.StrictMode.ThreadPolicy.Builder", Null)
        policy = policy.RunMethodJO("permitAll", Null).RunMethodJO("build", Null)
        Private sm As JavaObject
        sm.InitializeStatic("android.os.StrictMode").RunMethod("setThreadPolicy", Array(policy))
    End If
    
End Sub
Sub SqliteInit(ResetDB As Boolean)
    
    Private rp As RuntimePermissions
    Private datadir As String = rp.GetSafeDirDefaultExternal("")
    Sqlite.Close
    
    If ResetDB = True Then
        
        File.Delete(datadir, "sqlite.db") 'DELETES SQLITE DATABASE
    End If
    Sqlite.Initialize(datadir, "sqlite.db", True)
End Sub
Sub KvsInit(ResetKVS As Boolean)
    
    Private rp As RuntimePermissions
    
    If ResetKVS = True Then
        
        File.Delete(rp.GetSafeDirDefaultExternal(""),"keyvaluestore.dat")
    End If
    
    Kvs.Initialize(rp.GetSafeDirDefaultExternal(""), "keyvaluestore.dat")
    
End Sub
Sub SqliteTryExecNonQuery(sql As String) As Boolean 'Ignore
    
    Private result As Boolean
    Try
        Sqlite.ExecNonQuery(sql)
        
        result = True
        
    Catch
        
        result = False
        
    End Try
    
    If EnableLog Then Log("SQLITE:" & sql)
    If result = False Then
        
        LogException
    End If
    
    Return result
End Sub
Sub SqliteVacuum 'Ignore
    
    Private sql As String = "VACUUM"
    
    SqliteTryExecNonQuery(sql)
    
End Sub
Sub SqliteZap(table As String) 'Ignore DELETES ALL ROWS FROM A SQLITE TABLE
    
    Private sql As String = $"DELETE FROM "${table}""$
            
    SqliteTryExecNonQuery(sql)
    
End Sub
Sub SqliteDropTable(table As String) 'Ignore
    
    Private sql As String = $"DROP TABLE IF EXISTS "${table}""$
    
    SqliteTryExecNonQuery(sql)
End Sub
Sub SqliteToMysql(sqlitetable As String, mysqltable As String, DropBefore As Boolean) As Boolean 'ignore
    
    'CREATES A MYSQL TABLE FROM AN SQLITE TABLE. THE SQLITE TABLE MUST HAVE BEEN CREATED USING MYSQL_TO_SQLITE (BECAUSE OF COLUMN TYPES)
    Private rs As ResultSet
    Private Sql As StringBuilder
    Private result As Boolean = False
    
    If Mysql.IsInitialized = False Then
    
        Return result
    
    End If
    
    Sql.Initialize
    
    Sql.Append($"PRAGMA table_info("${sqlitetable}")"$)
    
    If EnableLog Then Log("SQLITE:" & Sql.ToString)
    rs = Sqlite.ExecQuery(Sql.ToString)
    
    If rs.RowCount = 0 Then
        
        rs.Close
        
        Return result
        
    End If
    
    If DropBefore = True Then
        
        MysqlDropTable(mysqltable)
                
    End If
    
    Sql.Initialize
    
    Sql.Append($"CREATE TABLE IF NOT EXISTS `${mysqltable}` ("$ & CRLF)
    Private firstrow As Boolean = True
    
    Private primarykey As String = ""
    Do While rs.NextRow
        
        If firstrow = False Then Sql.Append(", " & CRLF) Else firstrow = False
        
        Sql.Append($"`${rs.GetString("name")}` "$)
        
        Sql.Append($"${rs.GetString("type")}"$)
        
        If rs.GetInt("notnull") = 1 Then
            
            Sql.Append(" NOT NULL")
            
        End If
    
        If rs.GetString("dflt_value") <> Null Then
            
            Sql.Append(" DEFAULT " & rs.GetString("dflt_value"))
            
        End If
        
        If rs.GetInt("pk") = 1 Then primarykey = $"PRIMARY KEY (`${rs.GetString("name")}`)"$
    Loop
    
    rs.Close
    If primarykey.Length > 0 Then
        
        Sql.Append("," & CRLF & primarykey)
        
    End If
    
    Sql.Append(")")
    Sql.Append(" ENGINE=InnoDB DEFAULT CHARSET=utf8")
    'CREATE MYSQL TABLE
    
    result = MysqlTryExecNonQuery(Sql.ToString)
    
    Return result
    
End Sub
Sub SqliteToMysqlData(sqlitetable As String, mysqltable As String, wherefilter As String, orderby As String, deleterows As Boolean) As Boolean 'Ignore
    
    'INSERT/UPDATE ROWS FROM A SQLITE TABLE TO A MYSQL TABLE
    
    Private result As Boolean = False
    
    Private sqls As StringBuilder
    
    Private sqlm As StringBuilder
    
    If Mysql.IsInitialized = False Then
    
        Return result
    
    End If
    
    sqls.Initialize
    sqlm.Initialize
    Private rs As ResultSet
    sqls.append($"SELECT * FROM "${sqlitetable}""$)
    
    If wherefilter.Length > 0 Then
    
        sqls.Append(" WHERE " & wherefilter)
        
    End If
    If orderby.Length > 0 Then
    
        sqls.append(" ORDER BY " & orderby)
        
    End If
    rs = Sqlite.ExecQuery(sqls.ToString)
    
    sqlm.Append("REPLACE INTO `" & mysqltable & "`(")
    
    For icol = 0 To rs.ColumnCount - 1
        
        If icol > 0 Then sqlm.Append(",")
            
        sqlm.Append(rs.GetColumnName(icol))
            
    Next
        
    sqlm.Append(")")
    
    sqlm.Append(" VALUES(")
    
    For icol = 0 To rs.ColumnCount - 1
        
        If icol > 0 Then sqlm.Append(",")
            
        sqlm.Append("?")
            
    Next
        
    sqlm.Append(")")
    
    Private params(rs.ColumnCount) As String
    
    MysqlStartTransaction
    
    If deleterows = True Then
        
        MysqlZap(mysqltable)
        
    End If
    Try
    
        For i = 0 To rs.RowCount - 1
    
            rs.Position = i
            For x = 0 To rs.ColumnCount - 1
            
                params(x) = rs.GetString2(x)
            
            Next
        
            Mysql.ExecNonQuery2(sqlm.ToString, params)
        
        Next
    
        MysqlCommit
            
        result = True
    Catch
        LogException
        
        MysqlRollback
            
        result = False
    End Try
    
    rs.Close
    
    If EnableLog Then Log("SQLITE:" & sqls.ToString)
    If EnableLog Then Log("MYSQL :" & sqlm.ToString)
    
    Return result
    
End Sub
Sub LogException() 'ignore
    
    If LastException.IsInitialized Then
                
        Log(LastException.Message)
                
    End If
    
End Sub
Sub MysqlTryExecNonQuery(sql As String) As Boolean 'Ignore
    
    Private result As Boolean
    Try
        Mysql.ExecNonQuery(sql)
        
        result = True
        
    Catch
        
        result = False
        
    End Try
    
    If EnableLog Then Log("MYSQL :" & sql)
    If result = False Then LogException
        
    Return result
    
End Sub
Sub MysqlOpen As ResumableSub 'Ignore
    
    If Mysql.IsInitialized Then
        
        Return True
    
    End If
    Private mysqldriver As String = "com.mysql.jdbc.Driver"
    Private mysqlurl As String
    Private mysql_server As String = Kvs.Get("mysql_server")
    Private mysql_port As String = Kvs.GetDefault("mysql_port","3306")
    Private mysql_user As String = Kvs.Get("mysql_user")
    Private mysql_pass As String = Kvs.Get("mysql_pass")
    Private mysql_database As String = Kvs.Get("mysql_database")
    
    mysqlurl = "jdbc:mysql://" & mysql_server & ":" & mysql_port & "/" & mysql_database & "?autoReconnect=true&useSSL=false"
    
    If EnableLog Then Log(mysqlurl)
    
    Mysql.InitializeAsync("mysql", mysqldriver, mysqlurl, mysql_user, mysql_pass)
    
    wait for mysql_ready(result As Boolean)
    If result = False Then LogException
        
    Return result
    
End Sub
Sub MysqlClose 'Ignore
    If EnableLog Then Log("MYSQL.CLOSE")
    
    Mysql.Close
End Sub
Sub MysqlZap(table As String)
    
    Private sql As String = $"TRUNCATE TABLE `${table}`"$
    
    MysqlTryExecNonQuery(sql)
    
End Sub
Sub MysqlDropTable(table As String)
    
    Private sql As String = $"DROP TABLE IF EXISTS `${table}`"$
    
    MysqlTryExecNonQuery(sql)
End Sub
Sub MysqlToSqlite(mysqltable As String, sqlitetable As String, DropBefore As Boolean) As Boolean 'Ignore
    
    Private result As Boolean
    
    Private sqls As StringBuilder
    
    Private sqlm As String
    
    Private rs As JdbcResultSet
    'GET MYSQL TABLE STRUCTURE
    
    sqlm = $"SHOW COLUMNS FROM `${mysqltable}`"$
        
    Try
            
        rs = Mysql.ExecQuery(sqlm)
            
        result = True
    Catch
        result = False
    End Try
        
    If result = False Then
        
        LogException
        Return result
        
    End If
    If DropBefore = True Then
        
        SqliteDropTable(sqlitetable)
        
    End If
    'BUILD SQLITE CREATE TABLE COMMAND
    
    Private primarykey As String = ""
    
    sqls.Initialize
        
    sqls.Append($"CREATE TABLE IF NOT EXISTS "${sqlitetable}" ("$ & CRLF)
    Private firstrow As Boolean = True
    
    Do While rs.NextRow
                
        If firstrow = False Then sqls.Append(", " & CRLF) Else firstrow = False
        
        sqls.Append($""${rs.Getstring("field")}""$)
        
        sqls.Append(" " & rs.Getstring("type").Replace(" unsigned", ""))
                
        If rs.Getstring("key") = "PRI" Then
                    
            primarykey = $"PRIMARY KEY ("${rs.Getstring("field")}")"$
                    
        End If
        
        If rs.Getstring("null") = "NO" Then
            
            sqls.Append(" NOT NULL")
        
        End If
        
        If rs.Getstring("default") <> Null Then
            
            sqls.Append(" DEFAULT '" & rs.Getstring("default") & "'")
        
        End If
        
        If rs.Getstring("type").Contains(" unsigned") Then
            
            sqls.Append(" CHECK(" & rs.Getstring("field") & " >= 0)")
            
        End If
                    
    Loop
    
    If primarykey.Length > 0 Then
        
        sqls.Append("," & CRLF & primarykey & ")")
        
    Else
        
        sqls.Append(")")
        
    End If
    
    rs.Close 'CLOSE MYSQL RECORDSET
            
    result = SqliteTryExecNonQuery(sqls.ToString)
    
    Return result
        
End Sub
Sub MysqlToSqliteData(mysqltable As String, sqlitetable As String, wherefilter As String, orderby As String, deleterows As Boolean) As Boolean 'Ignore
    
    'INSERTS/UPDATES ROWS FROM A MYSQL TABLE TO A SQLITE TABLE
    
    Private sqlm As StringBuilder
    
    Private sqls As StringBuilder
    
    Private result As Boolean = False
    
    Private rs As JdbcResultSet
    
    If deleterows = True Then
        
        SqliteZap(sqlitetable)
        
    End If
    
    sqlm.Initialize
    
    sqls.Initialize
    
    sqlm.Append($"SELECT * FROM `${mysqltable}`"$)
    If wherefilter.Length > 0 Then
    
        sqlm.Append(" WHERE " & wherefilter)
        
    End If
    If orderby.Length > 0 Then
    
        sqlm.Append(" ORDER BY " & orderby)
        
    End If
    rs = Mysql.ExecQuery(sqlm.ToString)
            
    Private params(rs.ColumnCount) As String
        
    sqls.Append($"INSERT OR REPLACE INTO "${sqlitetable}"("$)
    
    For icol = 0 To rs.ColumnCount - 1
        
        If icol > 0 Then sqlm.Append(",")
            
        sqls.Append(rs.GetColumnName(icol))
            
    Next
    sqls.Append(")")
    sqls.Append($" VALUES("$)
    For icol = 0 To rs.ColumnCount - 1
        
        If icol > 1 Then sqls.Append(",")
            
        sqls.Append("?")
            
    Next
        
    sqls.Append(")")
    Sqlite.BeginTransaction
    
    Try
        
        Do While rs.NextRow
        
            For icol = 0 To rs.ColumnCount - 1
            
                params(icol) = rs.GetString2(icol)
                
            Next
        
            Sqlite.ExecNonQuery2(sqls.ToString, params)
            
        Loop
        
        Sqlite.TransactionSuccessful
        
        result = True
    
    Catch
        result = False
            
        LogException
        
    End Try
    Sqlite.EndTransaction
    
    rs.Close 'CLOSE MYSQL RECORDSET
    
    If EnableLog Then Log("SQLITE:" & sqls.ToString)
    If EnableLog Then Log("MYSQL :" & sqlm.ToString)
    Return result
    
End Sub
Sub MysqlGeneralLog(enable As Boolean) 'Ignore
    
    If enable = True Then
    
        MysqlTryExecNonQuery("SET global log_output = 'table'")
        MysqlTryExecNonQuery("SET global general_log = 1")
    
    Else
    
        MysqlTryExecNonQuery("SET global general_log = 0")
    
    End If
End Sub
Sub MysqlStartTransaction 'Ignore
    
    Private sql As String
    
    sql = "START TRANSACTION"
    
    Mysql.ExecNonQuery(sql)
    
    If EnableLog Then LogColor("MYSQL :" & sql, Colors.Yellow)
    
End Sub
Sub MysqlCommit 'Ignore
    
    Private sql As String
    
    sql = "COMMIT"
    
    Mysql.ExecNonQuery(sql)
    
    If EnableLog Then LogColor("MYSQL :" & sql, Colors.Yellow)
    
End Sub
Sub MysqlRollback 'Ignore
    
    Private sql As String
    
    sql = "ROLLBACK"
    
    Mysql.ExecNonQuery(sql)
    
    If EnableLog Then LogColor("MYSQL :" & sql, Colors.Yellow)
    
End Sub
	This Is what I see in the IDE Log, the START TRANSACTION AND THE COMMIT are listed BEFORE the actual insertion of the rows.
But this is what I see in the general_log table of the mysql server:
Everything looks fine there.
Why is the log displaying events out of order? Am I doing anything wrong?