Slavik9510

Untitled

Nov 26th, 2023
1,054
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.34 KB | None | 0 0
  1.         private async void triggerAnomaly_btn_Click(object sender, EventArgs e)
  2.         {
  3.             await Task.WhenAll(Transaction1(), Transaction2());
  4.         }
  5.  
  6.         private async Task Transaction1()
  7.         {
  8.             using var connection = new SqlConnection(connectionString);
  9.             await connection.OpenAsync();
  10.  
  11.             using var transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);
  12.             string currentName;
  13.             int currentVersion;
  14.             using (var command = new SqlCommand("SELECT first_name, version FROM Players WHERE player_id = 147", connection, transaction))
  15.             {
  16.                 using var reader = await command.ExecuteReaderAsync();
  17.  
  18.                 await reader.ReadAsync();
  19.                 currentName = reader.GetString(0);
  20.                 currentVersion = reader.GetInt32(1);
  21.                 logger.Log($"Transaction1 reads: {currentName}, version = {currentVersion}");
  22.  
  23.                 await reader.CloseAsync();
  24.             }
  25.  
  26.             // Змінюємо first_name
  27.             using (var command = new SqlCommand("UPDATE Players SET first_name = @first_name, version = @new_version WHERE player_id = 147 AND version = @version", connection, transaction))
  28.             {
  29.                 command.Parameters.AddWithValue("@first_name", currentName + "1");
  30.                 command.Parameters.AddWithValue("@new_version", currentVersion + 1);
  31.                 command.Parameters.AddWithValue("@version", currentVersion);
  32.                 await command.ExecuteNonQueryAsync();
  33.             }
  34.  
  35.             // Виводимо проміжний результат
  36.             using (var command = new SqlCommand("SELECT first_name, version FROM Players WHERE player_id = 147", connection, transaction))
  37.             {
  38.                 using var reader = await command.ExecuteReaderAsync();
  39.  
  40.                 await reader.ReadAsync();
  41.                 currentName = reader.GetString(0);
  42.                 currentVersion = reader.GetInt32(1);
  43.                 logger.Log($"Transaction1 reads: {currentName}, version = {currentVersion}");
  44.  
  45.                 await reader.CloseAsync();
  46.             }
  47.  
  48.             // Затримка перед завершенням транзакції
  49.             await Task.Delay(1000);
  50.  
  51.             await transaction.CommitAsync();
  52.             logger.Log("Transaction 1 completed");
  53.         }
  54.  
  55.         private async Task Transaction2()
  56.         {
  57.             int totalAttempts = 3;
  58.             for (int attempt = 0; attempt < totalAttempts; attempt++)
  59.             {
  60.                 using var connection = new SqlConnection(connectionString);
  61.                 await connection.OpenAsync();
  62.  
  63.                 using var transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);
  64.                 try
  65.                 {
  66.                     string currentName;
  67.                     int currentVersion;
  68.                     using (var command = new SqlCommand("SELECT first_name, version FROM Players WHERE player_id = 147", connection, transaction))
  69.                     {
  70.                         using var reader = await command.ExecuteReaderAsync();
  71.  
  72.                         await reader.ReadAsync();
  73.                         currentName = reader.GetString(0);
  74.                         currentVersion = reader.GetInt32(1);
  75.                         logger.Log($"Transaction2 reads: {currentName}, version = {currentVersion}");
  76.  
  77.                         await reader.CloseAsync();
  78.                     }
  79.  
  80.                     await Task.Delay(500);
  81.  
  82.                     // Змінюємо first_name
  83.                     using (var command = new SqlCommand("UPDATE Players SET first_name = @first_name, version = @new_version WHERE player_id = 147 AND version = @version", connection, transaction))
  84.                     {
  85.                         command.Parameters.AddWithValue("@first_name", currentName + "2");
  86.                         command.Parameters.AddWithValue("@new_version", currentVersion + 1);
  87.                         command.Parameters.AddWithValue("@version", currentVersion);
  88.  
  89.                         if (await command.ExecuteNonQueryAsync() == 0)
  90.                         {
  91.                             throw new Exception("The name was updated by another transaction");
  92.                         }
  93.                     }
  94.  
  95.                     using (var command = new SqlCommand("SELECT first_name, version FROM Players WHERE player_id = 147", connection, transaction))
  96.                     {
  97.                         using var reader = await command.ExecuteReaderAsync();
  98.  
  99.                         await reader.ReadAsync();
  100.                         currentName = reader.GetString(0);
  101.                         currentVersion = reader.GetInt32(1);
  102.                         logger.Log($"Transaction2 reads: {currentName}, version = {currentVersion}");
  103.  
  104.                         await reader.CloseAsync();
  105.                     }
  106.  
  107.                     logger.Log("Transaction 2 completed");
  108.                     await transaction.CommitAsync();
  109.                     break;
  110.                 }
  111.                 catch (Exception ex)
  112.                 {
  113.                     logger.Log($"Transaction 2: Error - {ex.Message}");
  114.                     await transaction.RollbackAsync();
  115.                     //task delay
  116.                 }
  117.             }
  118.         }
Advertisement
Add Comment
Please, Sign In to add comment