Объем транзакции - PullRequest
       60

Объем транзакции

1 голос
/ 07 января 2009

Как работает объем транзакции? Как он узнает, когда уже используется другой контекст, и как я могу реализовать другую область видимости в моем коде.

Я в первую очередь разработчик vb.net, но я могу читать c #, если вы напишите в этом.

В случае, если вышесказанное было слишком расплывчатым:

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

Например, если у меня есть следующее

using scope1 as new system.transactions.scope
    using scope2 as new system.transactions.scope
        using scope3 as new system.transactions.scope
             scope3.commit
        end using
        scope2.commit
    end using
end using

Scope1 не будет фиксироваться, и, следовательно, ни scope2, ни scope3 не будут, поскольку родительский объект для них является контекстом scope1. Я хотел бы иметь возможность установить это с моими собственными библиотеками.

Ответы [ 5 ]

7 голосов
/ 07 января 2009
0 голосов
/ 08 января 2009

Я не знаю, как System.Transaction работает внутри, но вы можете добиться этого, используя локальную память потока. В .NET атрибут ThreadStatic даст вам это. Объявите контекст своей области где-нибудь как это:

[ThreadStatic]
private static Context scopeContextThingy;

и в каждом потоке будет ровно один scopeContextThingy. Тогда, если scopeContextThingy == null, вы родитель и должны создать новый контекст. В противном случае вы - вложенная область видимости.

0 голосов
/ 08 января 2009

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

0 голосов
/ 07 января 2009

Ваш вопрос довольно двусмысленный, поэтому трудно понять, о чем вы на самом деле спрашиваете и ищете ответ, но, возможно, это поможет?

http://www.codeproject.com/KB/dotnet/TransactionScope20.aspx

0 голосов
/ 07 января 2009

Я сделаю удар, но я не уверен на 100% в этом вопросе.

Транзакции с точки зрения баз данных, как правило, имеют объемы. Это указывает на покрытие объема данных, который изменяется в рамках транзакции. Они реализованы на сервере базы данных и не могут быть изменены «в коде». Каждый сервер базы данных будет иметь свою собственную реализацию, и каждый сервер (oracle, MSSQL, MySQL) будет иметь свое собственное поведение.

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

  • Блокировка одного столбца в одной строке данных
  • затем блокировка одной строки данных
  • затем блокировка страницы данных (возможно, 8096 байт?)
  • затем блокировка всей таблицы данных

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

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

Надеюсь, это поможет!

...