|
|
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Для получения номера договора нужно организовать нечто вроде автоинкремента. Пытаюсь сделать так: в базе храню номер следующего договора. При помощи хранимой процедуры получаю этот номер и сразу его увеличиваю на единицу. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Проблема вот в чем: запускаю отладчик, дохожу до строки обновления номера. В QA еще раз запускаю на выполнение эту хранимую процедуру (имитация одновременного запроса от нескольких пользователей). Надеюсь, что второй запуск ХР дождеться пока отработает первый. Но получаю в ответ: Your transaction (process ID #9) was deadlocked with another process and has been chosen as the deadlock victim. Rerun your transaction. Почему второе обращени обрываеться? Может можно как-то проще реализовать инкремент? Овчинников Денис ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 15:16:59 |
|
||
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 15:25:35 |
|
||
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
Следующую конструкцию активно использую (очень активно) уже более года: CREATE TABLE [NewID] ( [id] [int] NOT NULL )GO CREATE PROCEDURE GetNewID AS DECLARE @next_id int BEGIN TRANSACTION UPDATE NewID SET ID = ID + 1 SELECT @next_id = ID FROM NewID COMMIT TRANSACTION RETURN @next_id GO Чего и Вам желаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 15:32:42 |
|
||
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
Trong'у Нет у меня в хелпе функции scope_identity(). У меня MS SQL 7. Так что я Вашу идею не понял. Можете обьяснить на пальцах? Овчинников Денис ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 15:36:03 |
|
||
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
Поменяйте порядок, в начале update а потом select и уровень изоляции менять не надо будет. Разумеется и update и select внутри одной транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 15:41:22 |
|
||
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
2 Денис: а @@identity есть? это аналог. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 15:43:53 |
|
||
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
2 Trong Понял, но это не совсем то, что мне нужно. 2 Genady Хороший совет. Пожалуй так и поступю. Овчинников Денис ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 16:03:36 |
|
||
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
можно и не мянять местами update c select'ом. Достаточно у селекта выставить хинт UPDLOCK и дидлок перестанет появляться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 16:30:42 |
|
||
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
Може так поможет? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 19:06:46 |
|
||
|
Как имитировать автоинкремент?
|
|||
|---|---|---|---|
|
#18+
MSSQL позволяет делать и так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Транзакции отдыхают. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2002, 19:21:33 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32058037&tid=1819618]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 345ms |

| 0 / 0 |
