транзакции и уровни изоляции не будут сброшены.».
Это все предыстория. Есть еще несколько вопросов SO об уровнях изоляции ненадежных транзакций, но ни один из них не охватывает то, что я хочу знать...
- один — Как предотвратить утечку уровень изоляции транзакций в соединениях пула
- другое — SQL Server: уровень изоляции протекает через соединения пула
Поскольку этот общий шаблон используется Microsoft (и другими), это предполагает (на мой взгляд), что ожидается использование пула соединений. А для объекта SqlConnection даже включен пул соединений по умолчанию.
Поэтому этот уровень изоляции дырявых (или постоянных) транзакций может показаться крайне нелогичным. Это действительно ужасная ловушка для непосвященных. Если запрос необходимо выполнить как прочитанный без фиксации (или, что менее хлопотно, сериализованный), а затем невинно вернуть его в пул соединений, следующий поток может преподнести неприятный сюрприз.
Вот небольшой пример программы, демонстрирующей этот неприятный сюрприз:
Код: Выделить всё
private static void PoolTest()
{
for (int poolMode = 1; poolMode item.MyValue == "UNEXPECTED");
// wait for the background thread (if there was one)
background?.Join();
}
if (scary)
Console.WriteLine($"{poolTest}/F: we got a dirty read, all unexpected-like; isn't that scary");
if (poolMode == 1)
Console.WriteLine();
}
}
// this is the test table, a simplification of tables used everywhere
private class Dto
{
public string? MyKey { get; set; }
public string? MyValue { get; set; }
public override string ToString() => $"{MyKey} {MyValue}";
}
Код: Выделить всё
IDbConnectionInterceptor
Я видел различные ответы, предлагающие использовать разные строки подключения для каждого предполагаемого уровня изоляции или просто никогда не использовать уровни изоляции вообще; они бесполезны за пределами игрушечных или очень маленьких программ.
Итак, вот мой актуальный вопрос:
Что намеревает Microsoft что нам делать? Каждый прямой пример, который я видел, подвержен этой утечке. Я видел, что в документации TDS указано такое поведение, но нет никаких намеков на то, почему это сделано именно так. Итак, почему пул соединений реализован таким образом, что новые и повторно используемые соединения имеют разное (и проблемное) поведение уровня изоляции транзакций по умолчанию?
Подробнее здесь: https://stackoverflow.com/questions/784 ... lation-lev