Внутренний TransactionScope с различным IsolationLevel, как это может быть достигнуто? - PullRequest
2 голосов
/ 24 августа 2010

В текущей реализации TransactionScope отсутствует возможность изменения IsolationLevels во вложенных областях.

MSDN состояния: при использовании вложенных объектов TransactionScope все вложенные области должны быть настроены на использование одного и того же уровня изоляции, если они хотят присоединиться к внешней транзакции. Если вложенный объект TransactionScope пытается присоединиться к внешней транзакции, но при этом он указывает другой уровень изоляции, выдается ArgumentException .

Однако SQL Server позволяет нам изменять уровни изоляции в любое удобное для вас время, почему TransactionScope не позволяет? Я не понимаю.

Существуют ли в BCL стандарты, касающиеся вложенных транзакций SQL и уровней их изоляции, которые запрещают такое поведение. Какие у меня варианты? Я, конечно, не могу разрабатывать библиотеки классов и продвигать вместе с ними уровни изоляции только ради того, чтобы их можно было использовать.

Если метод A () хочет уровень Snapshot и вызывает метод B (), который хочет уровень Read Committed . Метод A () находится в LibraryA, который разработан мной, метод B () находится в LibraryB, который разработан фиктивной компанией. Как A () позвонить B () без получения ArgumentException ?

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Это больше вопрос теории, чем какого-либо конкретного продукта.По сути, исходное понятие транзакции - это то, что имеет все свойства ACID: атомарный, последовательный, изолированный и долговечный.

http://databases.about.com/od/specificproducts/a/acid.htm

Теперь рассмотрим, что подразумевается под «изоляцией».уровень ": по существу, по причинам производительности или другим причинам, мы можем отказаться от некоторых или всех гарантий, которые база данных дает в отношении ACIDity.Изоляция и атомарность тесно связаны между собой, подобно двойственности друг друга.Разбейте один, а другой пострадает.

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

Теперь, если какая-то часть вашей транзакции требует большей степени изоляции, то вся транзакция также делает это, иначе она может сломаться во время чувствительной части,И наоборот, если какой-либо части предоставляется более низкий уровень изоляции, то вполне может быть, что для правильного функционирования этой части требуется меньшая степень изоляции.(Не просите меня привести хороший пример того, когда это может быть правдой.)

В любом случае, сервер базы данных не может сказать, совместимы ли фактические требования, поэтому он отказывается отпроблема в целом.

Что действительно должно произойти, так это то, что люди разрабатывают необходимые им транзакции.Я понимаю, что это не всегда легко, но в свете того факта, что ваша схема бизнес-данных принадлежит только вам, непросто соединить случайные компоненты SQL вместе.

В случае работы с централизованнымбазы данных (например, SQL Server) лучше всего проектировать целые транзакции, а затем, заметив общность проектов, вы можете выделить их, возможно, до того, как начнете писать «волосатый» код.

Если вам действительно нужно координировать действия междудругие хранилища данных (или аналогичные), тогда требуется диспетчер распределенных транзакций.Это отдельный продукт, и получить его еще сложнее, чем сервер базы данных.Но это необходимо для таких вещей, как банкоматы, которые либо дают вам деньги, либо нет, и которые либо попадают на ваш банковский счет, либо нет, и эти два должны совпадать.

Удачи!

0 голосов
/ 12 октября 2015

Я попал в эту проблему, как только догадываюсь, что опция исключения сбивает все с толку, и вы не можете достичь того, чтобы вместо этого можно было сделать нечто подобное. Дело в том, что при переключении уровня изоляции допускается только один уровень изоляции для каждого соединения.весь уровень изоляции изменяется до тех пор, пока не будет выполнена вложенность.

извлечение это стека

чтение замечаний по изоляции

...