снова multithreading

User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

снова multithreading

Post by Sabina »

Допустим юзер зарегистрировался на сайте и выполняется стейтмент

INSERT INTO users (userid,username)
VALUES((SELECT (MAX(userid)+1) FROM users),'name');

А если одновременно имеется несколько сессий и представим, что несколько юзеров нажали save одновременно? Как тут гарантировать уникальность выборки id?
В данном случае это снова JSP на Oracle. Речь идет о Model1, не о J2EE/MVC.

Спасибо,
Сабина
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

Ээээ ... вообще-то, в Oracle специально для этого generators придуманы. :pain1:
Не гоните, и не гонимы будете...
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

SBolgov wrote:Ээээ ... вообще-то, в Oracle специально для этого generators придуманы. :pain1:


Это какие generators? Которые часть Oracle Designer - Client/Server generators?
Мне казалось тут какое более концептуальное решение должно быть. Ну скажем как это решается в том коде, которые generators генерируют?
Есть например решение использовать sequences вместо вставки subqueries для получения нового id. Но неужели только это? Ведь казалось бы речь идет о самой распространенной ситуации...
Я просто правда не знаю, можно чуть подробнее?

Сабина
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

SBolgov wrote:Ээээ ... вообще-то, в Oracle специально для этого generators придуманы. :pain1:


Oracle ain't got no generators. It has *sequences* if that's what you meant.

VC
User avatar
Blake
Уже с Приветом
Posts: 1102
Joined: 16 Sep 2003 04:41
Location: Out Of Blue

Re: снова multithreading

Post by Blake »

Sabina wrote:Как тут гарантировать уникальность выборки id?


Установить нужный transaction isolation level, например "read committed"
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

Пардон, я действительно обозвал sequences генераторами. Сорри, перепутал. :pain1: Генераторами это называлось в Interbase. :lol:

Sabina wrote:Есть например решение использовать sequences вместо вставки subqueries для получения нового id. Но неужели только это? Ведь казалось бы речь идет о самой распространенной ситуации...

А чем Вас sequences-то не устраивают? :pain1:

Ситуация действительно самая распространённая, и в базе данных для этой ситуации сделан специальный механизм - sequences. :umnik1: Почему Вам так не хочется его использовать? :pain1:

Subquery ещё и с точки производительности хуже. :pain1: Сами подумайте - что дешевле: инкрементировать одну integer переменную или сделать запрос к таблице?
Не гоните, и не гонимы будете...
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: снова multithreading

Post by Sabina »

Blake wrote:
Sabina wrote:Как тут гарантировать уникальность выборки id?


Установить нужный transaction isolation level, например "read committed"


Как тут описано?
Большое "пионерское" спасибо :wink:

А там кстати сказано
READ COMMITTED is the default isolation level in Oracle SQL

То есть получается и делать ничего не надо :pain1:

Сабина
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

SBolgov wrote:А чем Вас sequences-то не устраивают? :pain1:


Меня устраивают, просто хочется знать единственное ли это решение.

Сабина
SBolgov
Уже с Приветом
Posts: 14006
Joined: 17 Jun 2003 04:41

Post by SBolgov »

Sabina wrote:
SBolgov wrote:А чем Вас sequences-то не устраивают? :pain1:

Меня устраивают, просто хочется знать единственное ли это решение.

Разумеется, не единственное, но остальные имеют массу недостатков. А sequences, насколько я понимаю, были введены специально для того, чтобы решить данную проблему.
Не гоните, и не гонимы будете...
User avatar
Blake
Уже с Приветом
Posts: 1102
Joined: 16 Sep 2003 04:41
Location: Out Of Blue

Re: снова multithreading

Post by Blake »

Sabina wrote:Большое "пионерское" спасибо :wink:

Большое "комсомольское" пожалуйста :wink:
Palych
Уже с Приветом
Posts: 13724
Joined: 16 Jan 2001 10:01

Re: снова multithreading

Post by Palych »

Blake wrote:Установить нужный transaction isolation level, например "read committed"

А кто помнит какой он по умолчанию?
Мне сдается что "read committed" и есть...
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: снова multithreading

Post by Sabina »

Palych wrote:А кто помнит какой он по умолчанию?
Мне сдается что "read committed" и есть...


так точно (см ссылку выше)

Сабина
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: снова multithreading

Post by vc »

Blake wrote:
Sabina wrote:Как тут гарантировать уникальность выборки id?


Установить нужный transaction isolation level, например "read committed"


READ COMMITTED (as well as any other IL) won't ensure that 'id' will be unique in the above SQL. The provided statement, by itself, wil never work correctly.

VC
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: снова multithreading

Post by Sabina »

vc wrote:The provided statement, by itself, wil never work correctly.
VC


Never :pain1: ?

Сабина
Lazy44
Уже с Приветом
Posts: 525
Joined: 01 May 2002 20:29
Location: CT->MA->TX->UT

Re: снова multithreading

Post by Lazy44 »

Sabina wrote:Допустим юзер зарегистрировался на сайте и выполняется стейтмент

INSERT INTO users (userid,username)
VALUES((SELECT (MAX(userid)+1) FROM users),'name');

А если одновременно имеется несколько сессий и представим, что несколько юзеров нажали save одновременно? Как тут гарантировать уникальность выборки id?
В данном случае это снова JSP на Oracle. Речь идет о Model1, не о J2EE/MVC.

Спасибо,
Сабина


Change it to
INSERT INTO users (userid,username)
VALUES(your_sequence_name.nextval ,'name');

Return to “Вопросы и новости IT”