Транзакции в Postgresql на C# при помощи Npgsql

147
26 января 2020, 11:40

Пытаюсь показать основные проблемы транзакций при помощи двух приложений, но не могу реализовать даже "грязное чтение". Есть кнопка "вывести баланс аккаунтов", которая должна показывать данные на текущем этапе транзакции. Обработка клика на нее выглядит вот так:

    new Select(sConn, trans).ShowDialog(); // вызывается новая форма

sConn и trans - глобально описанные подключение к БД и транзакция. При создании формы Select выполняется такой код:

    private void Select_Load(object sender, EventArgs e)
        {
            if (sConn.State != ConnectionState.Open)
                sConn.Open(); //когда транзакция завершилась, я закрываю соединение, 
                              //поэтому надо его снова открыть
            var sCommand = new NpgsqlCommand
            {
                CommandText = "select * from accounts",
                Connection = sConn, 
                Transaction = trans
            };
            using (var reader = sCommand.ExecuteReader())
            {
                while (reader.Read())
                {
                    dataGridView1.Rows.Add((string)reader["login"], ((decimal)reader["balance"]).ToString());
                }
            }
        }

И вот, например, в первом приложении я выполняю такой код:

sConn.Open();
trans = sConn.BeginTransaction(IsolationLevel.ReadUncommitted);

Уровень изоляции - ReadUncommitted, то есть если я сейчас изменю в другой транзакции данные, то я увижу это изменение внутри выше описанной транзакции. Проверяем. В другом приложении выполняю такой код:

  sConn.Open();
  trans = sConn.BeginTransaction();
  sCommand = new NpgsqlCommand
  {
       Connection = sConn,
       CommandText = @"update accounts set balance = balance + cast(1000 as money) where id = 27",
       Transaction = trans
  };
   sCommand.ExecuteNonQuery();

Но! Нажав на кнопку "вывести баланс аккаунтов" из 1 приложения (1 транзакция), я получаю неизмененную информацию. Но ведь изоляция уровня ReadUncommitted. Как сделать так, чтобы 1 приложение увидело изменения?

Answer 1

Никак. Postgresql не поддерживает ReadUncommitted, потому что считается, что такой уровень изоляции не дает преимуществ. https://edu.postgrespro.ru/dev1/dev1_03_arch_mvcc.pdf

READ ALSO
Telegram bot .net с использованием webhook постоянно шлет update

Telegram bot .net с использованием webhook постоянно шлет update

Начал писать Телеграм-бот с использованием webhook и столкнулся с проблемой - при вводе тестовой команды, Telegram постоянно шлет update, даже если не ввожу...

149
Десериализация JSON с массивами в C#

Десериализация JSON с массивами в C#

JSON файл содержит поле и три массиваПервые 2 массива описывают данные, последний массив содержит массивы с данными, каждый массив это один...

150
Как создать аналог event listener на php?

Как создать аналог event listener на php?

Нужен метод который будет отслеживать изменения в свойствах другого классаПодскажите, пожалуйста, как можно это реализовать или где об этом...

138