#sql #sql-server #tsql
Вопрос:
if not exists (select * from sysobjects where name='cars' and xtype='U')
create table cars (
Name varchar(64) not null
)
go
Если я запущу вышеуказанный пакет из нескольких одновременных транзакций, будет ли он работать каждый раз без ошибок или может ли быть гонка между операторами if и create?
Комментарии:
1. Лучший вопрос заключается в том, почему вам нужно, чтобы несколько пакетов создавали (и предположительно использовали) одну и ту же постоянную таблицу. Да — расовое состояние.
2. Каждый тран хочет вставить в таблицу другую строку. Я не хочу создавать таблицу, если мне это действительно не нужно. Это может быть плохая схема, но она облегчает работу остальной системы, если она работает.
3. @HariKrishnaS это проблема x/y, то есть проблема, которую вы пытаетесь решить здесь, не является реальной проблемой. Если вы объясните, почему/как это, по-видимому, улучшает работу остальной системы, вы получите лучший ответ. Потому что очень маловероятно, что создание таких таблиц на лету-лучшее решение.
4. XY проблема наверняка — создайте таблицу один раз, в которой вы (или, предпочтительно, администратор базы данных / опытный разработчик баз данных) можете назначить разрешения, индексирование и т. Д. И добавить соответствующие действия по обслуживанию (если таковые имеются) в систему и системную документацию.
Ответ №1:
Если под условием гонки вы подразумеваете, что несколько транзакций одновременно проверят, что таблица не существует, а затем одновременно попытаются создать таблицу автомобилей, то да. Но зачем беспокоиться, один добьется успеха, другие потерпят неудачу. Тем не менее, я думаю, вам следует пересмотреть свою стратегию в отношении того, как вы поступаете. Более подробная информация необходима для предоставления дальнейших консультаций.
Комментарии:
1. Я играю, чтобы посмотреть, сработает ли это. До сих пор это работало со мной, но неделю он работал и с большей нагрузкой. Разве такие вещи не должны быть где-то задокументированы?
2. @HariKrishnaS такие вещи задокументированы, но вы, вероятно, ищете не в том месте. Вам нужно понять общую картину, заключающуюся в том, что каждая инструкция SQL в SQL Server выполняется в своей собственной неявной транзакции, поэтому блокировки длятся так долго. Для более длительных блокировок вам нужна явная транзакция, и часто явные блокировки.