Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private async void triggerAnomaly_btn_Click(object sender, EventArgs e)
- {
- await Task.WhenAll(Transaction1(), Transaction2());
- }
- private async Task Transaction1()
- {
- using var connection = new SqlConnection(connectionString);
- await connection.OpenAsync();
- using var transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);
- string currentName;
- int currentVersion;
- using (var command = new SqlCommand("SELECT first_name, version FROM Players WHERE player_id = 147", connection, transaction))
- {
- using var reader = await command.ExecuteReaderAsync();
- await reader.ReadAsync();
- currentName = reader.GetString(0);
- currentVersion = reader.GetInt32(1);
- logger.Log($"Transaction1 reads: {currentName}, version = {currentVersion}");
- await reader.CloseAsync();
- }
- // Змінюємо first_name
- using (var command = new SqlCommand("UPDATE Players SET first_name = @first_name, version = @new_version WHERE player_id = 147 AND version = @version", connection, transaction))
- {
- command.Parameters.AddWithValue("@first_name", currentName + "1");
- command.Parameters.AddWithValue("@new_version", currentVersion + 1);
- command.Parameters.AddWithValue("@version", currentVersion);
- await command.ExecuteNonQueryAsync();
- }
- // Виводимо проміжний результат
- using (var command = new SqlCommand("SELECT first_name, version FROM Players WHERE player_id = 147", connection, transaction))
- {
- using var reader = await command.ExecuteReaderAsync();
- await reader.ReadAsync();
- currentName = reader.GetString(0);
- currentVersion = reader.GetInt32(1);
- logger.Log($"Transaction1 reads: {currentName}, version = {currentVersion}");
- await reader.CloseAsync();
- }
- // Затримка перед завершенням транзакції
- await Task.Delay(1000);
- await transaction.CommitAsync();
- logger.Log("Transaction 1 completed");
- }
- private async Task Transaction2()
- {
- int totalAttempts = 3;
- for (int attempt = 0; attempt < totalAttempts; attempt++)
- {
- using var connection = new SqlConnection(connectionString);
- await connection.OpenAsync();
- using var transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);
- try
- {
- string currentName;
- int currentVersion;
- using (var command = new SqlCommand("SELECT first_name, version FROM Players WHERE player_id = 147", connection, transaction))
- {
- using var reader = await command.ExecuteReaderAsync();
- await reader.ReadAsync();
- currentName = reader.GetString(0);
- currentVersion = reader.GetInt32(1);
- logger.Log($"Transaction2 reads: {currentName}, version = {currentVersion}");
- await reader.CloseAsync();
- }
- await Task.Delay(500);
- // Змінюємо first_name
- using (var command = new SqlCommand("UPDATE Players SET first_name = @first_name, version = @new_version WHERE player_id = 147 AND version = @version", connection, transaction))
- {
- command.Parameters.AddWithValue("@first_name", currentName + "2");
- command.Parameters.AddWithValue("@new_version", currentVersion + 1);
- command.Parameters.AddWithValue("@version", currentVersion);
- if (await command.ExecuteNonQueryAsync() == 0)
- {
- throw new Exception("The name was updated by another transaction");
- }
- }
- using (var command = new SqlCommand("SELECT first_name, version FROM Players WHERE player_id = 147", connection, transaction))
- {
- using var reader = await command.ExecuteReaderAsync();
- await reader.ReadAsync();
- currentName = reader.GetString(0);
- currentVersion = reader.GetInt32(1);
- logger.Log($"Transaction2 reads: {currentName}, version = {currentVersion}");
- await reader.CloseAsync();
- }
- logger.Log("Transaction 2 completed");
- await transaction.CommitAsync();
- break;
- }
- catch (Exception ex)
- {
- logger.Log($"Transaction 2: Error - {ex.Message}");
- await transaction.RollbackAsync();
- //task delay
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment