Транзакции в .net

Добавление к принятому ответу от epascarello, так как я не могу его прокомментировать. Я все еще здесь. Когда один из строк не имеет номера, исходный ответ не будет работать. Например, A и A10 не будут сортироваться в этом порядке. Следовательно, вы можете wamnt вернуться к нормальной сортировке в этом случае.

var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a,b) {
    var aA = a.replace(reA, "");
    var bA = b.replace(reA, "");
    if(aA === bA) {
      var aN = parseInt(a.replace(reN, ""), 10);
      var bN = parseInt(b.replace(reN, ""), 10);
      if(isNaN(bN) || isNaN(bN)){
        return  a > b ? 1 : -1;
      }
      return aN === bN ? 0 : aN > bN ? 1 : -1;
    } else {
     return aA > bA ? 1 : -1;
    }
 }
 ["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12","F3"].sort(sortAlphaNum);`
139
задан Malik Daud Ahmad Khokhar 22 October 2008 в 07:23
поделиться

4 ответа

Существует 2 основных вида транзакций; транзакции соединения и окружающие транзакции. Транзакция соединения (такая как SqlTransaction) связывается непосредственно с соединением дб (таким как SqlConnection), что означает, что необходимо продолжать раздавать соединение - хорошо в некоторых случаях, но не позволяет, "создают/используют/выпускают" использование, и не позволяет работу перекрестного дб. Пример (отформатированный для пространства):

using (IDbTransaction tran = conn.BeginTransaction()) {
    try {
        // your code
        tran.Commit();
    }  catch {
        tran.Rollback();
        throw;
    }
}

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

альтернатива является окружающей транзакцией; новый в.NET 2.0, объект TransactionScope (System.Transactions.dll) позволяет использование по диапазону операций (подходящие поставщики автоматически поступят на службу в окружающую транзакцию). Это облегчает модифицировать в существующий (нетранзакционный) код и говорить с несколькими поставщиками (хотя DTC примет участие, если Вы будете говорить с больше чем одним).

, Например:

using(TransactionScope tran = new TransactionScope()) {
    CallAMethodThatDoesSomeWork();
    CallAMethodThatDoesSomeMoreWork();
    tran.Complete();
}

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

, Если Ваши ошибки в коде, Расположите (), то будет назван без Полного (), таким образом, это будет откатываться. Ожидаемое вложение и т.д. поддерживается, хотя Вы не можете откатывать внутреннюю транзакцию, все же завершают внешнюю транзакцию: если кто-либо недоволен, транзакция прерывается.

другое преимущество TransactionScope состоит в том, что он не связывается только с базами данных; любой осведомленный о транзакции поставщик может использовать его. WCF, например. Или существуют даже некоторые TransactionScope-совместимые объектные модели вокруг (т.е. классы.NET с возможностью отката - возможно, легче, чем сувенир, хотя я никогда не использовал этот подход сам).

, В целом, очень, очень полезный объект.

Некоторые протесты:

  • На SQL Server 2000, TransactionScope сразу перейдет к DTC; это фиксируется в SQL Server 2005 и выше, это может использовать LTM (намного меньше служебный), пока Вы не говорите с 2 источниками и т.д., когда это поднято до DTC.
  • существует незначительный сбой , который означает, что Вы, возможно, должны были бы настроить свою строку подключения
260
ответ дан Community 22 October 2008 в 07:23
поделиться

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

3
ответ дан Charles Graham 22 October 2008 в 07:23
поделиться

Это также зависит от того, в чем Вы нуждаетесь. Для основных транзакций SQL Вы могли попытаться делать, транзакции TSQL при помощи НАЧИНАЮТ СДЕЛКУ и ФИКСИРУЮТ СДЕЛКУ в Вашем коде. Это - самый легкий путь, но он действительно имеет сложность, и необходимо стараться фиксировать правильно (и откат).

я использовал бы что-то как

SQLTransaction trans = null;
using(trans = new SqlTransaction)
{
    ...
    Do SQL stuff here passing my trans into my various SQL executers
    ...
    trans.Commit  // May not be quite right
}

, Любой отказ вытолкает Вас прямо из using, и транзакция будет всегда фиксировать или откатывать (в зависимости от того, что Вы говорите ему делать). Самая большая проблема, с которой мы столкнулись, удостоверялась, что всегда фиксировала. Использование гарантирует, что объем транзакции ограничен.

0
ответ дан webnoob 22 October 2008 в 07:23
поделиться

если Вам просто нужен он для связанного с дб материала, некоторые ИЛИ Картопостроители (например, NHibernate) поддерживают transactinos из поля на значение по умолчанию.

1
ответ дан Joachim Kerschbaumer 22 October 2008 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: