バージョン情報
MySQL 5.0.77
SQLServer2012
ASP.net(.NET Framework 4)
発生している問題・エラーメッセージ
SQLServerからMySQLへ、データ同期をとるために
複数テーブルに対して、
- MySQLデータのdelete
- SQLServerのselect
- MySQLへinsert(select件数分)
の3ステップによりデータの更新を行っていますが
運用して数年経った今、途中でエラーが発生するようになってしまいました。
System.InvalidOperationException: Connection must be valid and open to rollback transaction
このエラーに対する対処法を探しています。
同じデータで試しても開発環境では発生しない現象なので、環境設定に依存するのかと思い
MySQLにて「timeout」に関する設定を確認してみたのですが、いずれの環境でも以下のような設定になっており、差異が見つけられませんでした。
Variable_name | Value |
---|---|
connect_timeout | 10 |
delayed_insert_timeout | 300 |
innodb_lock_wait_timeout | 50 |
innodb_rollback_on_timeout | OFF |
interactive_timeout | 28800 |
net_read_timeout | 30 |
net_write_timeout | 60 |
slave_net_timeout | 3600 |
table_lock_wait_timeout | 50 |
wait_timeout | 28800 |
よろしくお願いします。
=== 追記 ===
ソースは以下のように記述しています。
ASP.net
1Dim SE As New clsDbAccess 2Dim MySqlSE As New clsMySqlAccess 3 4'***** MySql接続設定開始 ***** 5MySqlSE.ConnectionString = "接続文字列" 6MySqlSE.CommandTimeout = CommandTimeout 7 8'### トランザクション 9MySqlSE.BeginTransaction() 10'***** MySql接続設定終了 ***** 11 12'### 接続コネクション設定(SqlServer) 13SE.ConnectionString = "接続文字列" 14SE.CommandTimeout = CommandTimeout 15 16'### トランザクション 17SE.BeginTransaction() 18 19' 20'SQLServerに対する更新処理 21'~~ 22' 23 24'SQLServer⇒MySQLへのデータ流し込み 25 26''deleteその1 27strSQL = "DELETE FROM tableA_MySQL WHERE ~" 28 29MySqlSE.CommandString = strSQL 30MySqlSE.ExecuteTSQL() 31 32''selectその1 33strSQL = "SELECT * FROM tableB_SQLServer WHERE ~" 34 35SE.TableName = "RESULT" 36SE.CommandString = strSQL 37SE.ExecuteSQL() 38 39Dim DT_TMP As DataTable = Nothing 40DT_TMP = SE.TableData.Tables(SE.TableName) 41 42For i = 0 To DT_TMP.Rows.Count - 1 43 ''insertその1 44 strSQL = " INSERT INTO tableC_MySQL (~) VALUES (~) " 45 46 MySqlSE.CommandString = strSQL 47 MySqlSE.ExecuteTSQL() 48Next 49 50''deleteその2 51strSQL = "DELETE FROM tableD_MySQL WHERE ~" 52 53MySqlSE.CommandString = strSQL 54MySqlSE.ExecuteTSQL() 55 56''selectその2 57strSQL = "SELECT * FROM tableE_SQLServer WHERE ~" 58 59SE.TableName = "RESULT" 60SE.CommandString = strSQL 61SE.ExecuteSQL() 62 63Dim DT_TMP As DataTable = Nothing 64DT_TMP = SE.TableData.Tables(SE.TableName) 65 66For i = 0 To DT_TMP.Rows.Count - 1 67 ''insertその2 68 strSQL = " INSERT INTO tableF_MySQL (~) VALUES (~) " 69 70 MySqlSE.CommandString = strSQL 71 MySqlSE.ExecuteTSQL() 72Next 73 74''deleteその3 75strSQL = "DELETE FROM tableG_MySQL WHERE ~" 76 77MySqlSE.CommandString = strSQL 78MySqlSE.ExecuteTSQL() 79 80''selectその3 81strSQL = "SELECT * FROM tableH_SQLServer WHERE ~" 82 83SE.TableName = "RESULT" 84SE.CommandString = strSQL 85SE.ExecuteSQL() 86 87Dim DT_TMP As DataTable = Nothing 88DT_TMP = SE.TableData.Tables(SE.TableName) 89 90For i = 0 To DT_TMP.Rows.Count - 1 91 ''insertその3 92 strSQL = " INSERT INTO tableI_MySQL (~) VALUES (~) " 93 94 MySqlSE.CommandString = strSQL 95 MySqlSE.ExecuteTSQL() 96Next 97 98'### コミット(SqlServer) 99SE.Commit() 100 101'### コミット(MySql) 102MySqlSE.Commit() 103 104 105 106 107'' クラス定義 108Public Class clsMySqlAccess 109 Public Function ExecuteTSQL() As Boolean 110 111 'トランザクションが開始されているかどうか 112 If _sqlTransaction Is Nothing Then 113 OpenConnection() 114 _sqlCommand = New MySqlCommand(_commandString, _sqlConnection) 115 _sqlCommand = _sqlConnection.CreateCommand 116 117 _sqlCommand.CommandTimeout = _commandTimeout 118 Else 119 _sqlCommand = New MySqlCommand(_commandString, _sqlConnection) 120 _sqlCommand.Transaction = _sqlTransaction 121 _sqlCommand.CommandTimeout = _commandTimeout 122 End If 123 124 _executeCount = _sqlCommand.ExecuteNonQuery() 125 126 If _sqlTransaction Is Nothing Then 127 CloseConnection() 128 End If 129 130 Return True 131 132 End Function 133End Class 134 135Public Class clsDbAccess 136 Public Function ExecuteSQL() As Boolean 137 138 Dim DS As New DataSet() 139 140 'トランザクションが開始されているかどうか 141 If _sqlTransaction Is Nothing Then 142 OpenConnection() 143 _sqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter() 144 _sqlDataAdapter.SelectCommand = New System.Data.SqlClient.SqlCommand(_commandString, _sqlConnection) 145 _sqlDataAdapter.SelectCommand.CommandTimeout = _commandTimeout 146 Else 147 _sqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter() 148 _sqlDataAdapter.SelectCommand = New System.Data.SqlClient.SqlCommand(_commandString, _sqlConnection) 149 _sqlDataAdapter.SelectCommand.Transaction = _sqlTransaction 150 _sqlDataAdapter.SelectCommand.CommandTimeout = _commandTimeout 151 End If 152 153 'DataSetにSelect結果を格納 154 _sqlDataAdapter.Fill(DS, _tableName) 155 _executeCount = DS.Tables(0).Rows.Count 156 157 _tableData = DS 158 159 If _sqlTransaction Is Nothing Then 160 CloseConnection() 161 End If 162 163 Return True 164 165 End Function 166End Class 167 168 169 170 171