Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 09:18   #1
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию вставка уникального значения

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

Я пока придумал только через сериализуемую транзакцию с откатом по исключению. Это нормальный подход?

Код:
        public static void UniqueAdd(this SqlConnection con, int i, string name)
        {  
            using (var tr = con.BeginTransaction(IsolationLevel.Serializable))
            {
                try
                {
                    var co = con.CreateCommand();
                    co.Transaction = tr;
                    co.CommandType = CommandType.Text;
                    co.CommandText = String.Format(@"IF NOT EXISTS(SELECT TOP 1 I FROM WALL WHERE I = {0}) INSERT INTO WALL(I,V) VALUES({0},'{1}')", i, name);
                    co.ExecuteNonQuery();                    
                    tr.Commit();
                }
                catch(SqlException ex)
                {                    
                    tr.Rollback();                    
                }
            }
        }
the_deer_one вне форума Ответить с цитированием
Старый 31.03.2013, 10:03   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

зачем тут транзакция? она ничего не делает, кроме лишней нагрузке
и кстати, почему именно Serializable?
eval вне форума Ответить с цитированием
Старый 31.03.2013, 10:30   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Serializable явно тормоза. Уникальный индекс для поля I решит все проблемы. Тогда и предбанник в виде IF NOT EXISTS не нужен будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 31.03.2013 в 10:41.
Аватар вне форума Ответить с цитированием
Старый 31.03.2013, 17:35   #4
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Угу, с уникальным индексом, с предбанником IF NOT EXISTS но без явно определённой транзакции так же работает в плане времени выполнения как и вариант с транзакцией.

Если убрать предбанник, то работает в два раза медленнее.
the_deer_one вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск значения по цвету и вставка в другую книгу rus33 Microsoft Office Excel 2 08.11.2012 08:11
Вставка даты на основе введенного значения Anubys C++ Builder 1 02.04.2012 09:51
Сумма не уникального поля. Дмитрий mause Помощь студентам 4 25.01.2012 17:08
Вставка строки макросом при выборе значения из списка MaxxVer Microsoft Office Excel 5 25.08.2011 13:27
Вставка значения в таблицу с автоинкриментным полем artemavd БД в Delphi 5 16.05.2009 12:14