2010-04-13 4 views
1

Является ли вставка с autocommit гарантией того, что она будет немедленно видима для любого SqlConnection в базе данных или только для собственного SqlConnection?Autocommit и несколько SqlConnections

У меня есть процедура с 3 SqlConnections. Соединение Один связано с SqlDataReader, который управляет циклом. С помощью цикла соединение Two используется для получения данных для теста, а Connection Three используется для вставки строк в таблицу. Автосообщения вставки.

У нас возникла ситуация, когда тест (с использованием данных соединения 2) терпит неудачу. Одно из возможных объяснений заключается в том, что Connection Two иногда не видит строку, вставленную Connection Three, на предыдущий проход через цикл. Это возможно?

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

+1

У вас есть образец кода, который показывает проблему? – BlackICE

+0

Возможно, я добавил, что соединения «Два» и «Три» открыты и закрыты для использования, поэтому соединение «Три» будет закрыто, когда подозрительные данные будут получены двумя. – SeaDrive

+0

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

ответ

2

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

Однако вставка строк не изменяет строки, возвращаемые уже существующей SqlDataReader, так как SqlDataReader объект инкапсулирует набор записей - в результаты из запроса - а не сам запрос.

Я не уверен, что делает ваше «соединение два», но если это зависит от результатов INSERT в C3, которые видны SqlDataReader, то по этой причине это обязательно закончится.

0

Это вы делаете?

  1. Вы используете открытый SQLDataReader, который будет получать данные, а затем прокручивать их.
  2. В этом цикле вы вставляете запись, которую вы затем ожидаете, с помощью оператора select, используемого в считывателе.
  3. Вы не видите его в цикле, поскольку данные уже выбраны.
+0

Позвольте мне сказать следующее: У меня есть некоторые транзакции, которые нужно обработать. Для каждой учетной записи существует несколько транзакций. Существует годовой лимит, поэтому транзакции не обрабатываются после достижения лимита. Я выполняю транзакции с использованием Connection One и SqlDataReader. В цикле я использую оператор select в Connection Two, чтобы найти текущую сумму. Если сумма все еще меньше предела, я использую Connection Three для вставки строки. Если это та же самая учетная запись, то Total, возвращаемая Select, должна (и обычно) включать строку, вставленную в предыдущий проход через цикл. – SeaDrive

+0

@SeaDrive - В этом случае вы уверены, что ваша вставка всегда срабатывает, как ожидалось? – Paddy

+0

Строки всегда есть. Принимая первое предложение Аароноута как правильное, я должен искать в другом месте ошибку. У меня есть альтернативная гипотеза, связанная с функцией, возвращающей текущую сумму. – SeaDrive

Смежные вопросы