Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как правильно делать update?  [new]
sqlmiha1
Member

Откуда:
Сообщений: 28
для одного поля "test "друг за другом в c# делаю

BEGIN TRANSACTION;
UPDATE SET f1 = 1 WHERE s='test';
COMMIT TRANSACTION

BEGIN TRANSACTION;
UPDATE SET f2 = 1 WHERE s='test';
COMMIT TRANSACTION

BEGIN TRANSACTION;
UPDATE SET f3 = 1 WHERE s='test';
COMMIT TRANSACTION

BEGIN TRANSACTION;
UPDATE SET f4 = 1 WHERE s='test';
COMMIT TRANSACTION

получаю блокировку транзакций
как правильно делать update?
20 апр 14, 12:54    [15907081]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
UPDATE T SET f1 = 1, f2 = 1, f3 = 1, f4 = 1 WHERE s='test';
20 апр 14, 13:23    [15907126]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
sqlmiha1
Member

Откуда:
Сообщений: 28
iap, спасибо работает
но если не ставлю

SET IMPLICIT_TRANSACTIONS ON

BEGIN TRANSACTION
update ...
COMMIT TRANSACTION


то транзакции очень долго записываются

если SET IMPLICIT_TRANSACTIONS ON убираю то опять возникают блокировки
20 апр 14, 14:03    [15907170]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
aleks2
Guest
sqlmiha1
iap, спасибо работает
но если не ставлю

SET IMPLICIT_TRANSACTIONS ON

BEGIN TRANSACTION
update ...
COMMIT TRANSACTION


то транзакции очень долго записываются

если SET IMPLICIT_TRANSACTIONS ON убираю то опять возникают блокировки



Опять чукча-писатель? Читал ли ты документацию по инструкциям?

Вот ЭТО АБСОЛЮТНО ЭКВИВАЛЕНТНО.

SET IMPLICIT_TRANSACTIONS ON

BEGIN TRANSACTION
update ...
COMMIT TRANSACTION


BEGIN TRANSACTION
update ...
COMMIT TRANSACTION


update ...
20 апр 14, 14:26    [15907196]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
aleks2
Вот ЭТО АБСОЛЮТНО ЭКВИВАЛЕНТНО.
К сожалению, нет:
if @@trancount > 0
 rollback;

set implicit_transactions on;

begin tran;
select @@trancount;
rollback;

Согласно документации, в режиме implicit_transactions инструкция begin tran начнет неявную транзакцию и она же начинает явную. В результате у ТС остается незавершенная транзакция.
20 апр 14, 14:52    [15907232]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
aleks2
Guest
Да ну? Врешь
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_6tsql/html/a300ac43-e4c0-4329-8b79-a1a05e63370a.htm

When ON, SET IMPLICIT_TRANSACTIONS sets the connection into implicit transaction mode. When OFF, it returns the connection to autocommit transaction mode.

When a connection is in implicit transaction mode and the connection is not currently in a transaction, executing any of the following statements starts a transaction:

ALTER TABLE
FETCH
REVOKE

CREATE
GRANT
SELECT

DELETE
INSERT
TRUNCATE TABLE

DROP
OPEN
UPDATE


If the connection is already in an open transaction, the statements do not start a new transaction.
20 апр 14, 16:53    [15907403]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
sqlmiha1
Member

Откуда:
Сообщений: 28
aleks2, так как правильно update делать чтобы блокировок не было? пример кода можно ?
20 апр 14, 17:16    [15907440]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
sqlmiha1
aleks2, так как правильно update делать чтобы блокировок не было? пример кода можно ?
UPDATEа без блокировок не бывает!
20 апр 14, 17:20    [15907450]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
sqlmiha1
Member

Откуда:
Сообщений: 28
iap, что тогда проверять перед вызовом update чтобы их не было?
20 апр 14, 17:24    [15907456]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
aleks2
Да ну? Врешь
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_6tsql/html/a300ac43-e4c0-4329-8b79-a1a05e63370a.htm
Что же на онлайновую документацию ссылок не приводишь? Наверное потому, что из них будет видно, что врешь ты сам?
Начиная с 2008 версии сервера begin tran документирована как инструкция, стартующая неявную транзакцию. Так что локальный BOL тоже неплохо было бы обновлять.

А код примера все-таки выполни. Сервер в твоей голове работает не так как реальный.
20 апр 14, 18:18    [15907523]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
sqlmiha1
Member

Откуда:
Сообщений: 28
invm,что тогда проверять перед вызовом update чтобы их не было?
20 апр 14, 18:42    [15907575]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
Glory
Member

Откуда:
Сообщений: 104760
sqlmiha1
что тогда проверять перед вызовом update чтобы их не было?

Еще раз, update без блокировок невозможен.
20 апр 14, 20:46    [15907812]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
sqlmiha1
Member

Откуда:
Сообщений: 28
Glory, то есть если возникает блокировка то повторять тразнакцию?
в каких БД можно делать update без блокировок?
20 апр 14, 20:47    [15907815]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
Glory
Member

Откуда:
Сообщений: 104760
sqlmiha1
то есть если возникает блокировка то повторять тразнакцию?

Блокировки - это механизм для многопользовательского доступа

sqlmiha1
в каких БД можно делать update без блокировок?

Это когда два пользователя одновременно изменяют одно поле ? И там получается часть от одного обновления и часть от другого ?
20 апр 14, 20:53    [15907833]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
sqlmiha1
Member

Откуда:
Сообщений: 28
mssql 2012 не умеет делать в одну таблицу параллельно по разным id 100 update? все только друг за другом?
20 апр 14, 22:34    [15908163]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
sqlmiha1
Member

Откуда:
Сообщений: 28
у меня 1 пользователь делает по разным id 100 update и идут блокировки
20 апр 14, 22:35    [15908167]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
aleks2
Guest
sqlmiha1
у меня 1 пользователь делает по разным id 100 update и идут блокировки

Осподе! Избави нас, грешных, от чукчей-писателей!

Ты прочитал "как и почему возникают дедлоки"?
21 апр 14, 06:27    [15908733]     Ответить | Цитировать Сообщить модератору
 Re: как правильно делать update?  [new]
Glory
Member

Откуда:
Сообщений: 104760
sqlmiha1
mssql 2012 не умеет делать в одну таблицу параллельно по разным id 100 update? все только друг за другом?

Сервер умеет.
А вот разработчики не умеют писать правильный код для этого.
21 апр 14, 09:25    [15909064]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить