Avatar billede speedpete Nybegynder
02. november 2007 - 13:14 Der er 6 kommentarer og
1 løsning

transaktioner, isolation

Min version er 5.0, og jeg har en asp.net applikation ovenpå.

Jeg har ikke helt styr på transaktioner...

Hvis man siger (pseudokode)
int max = Select max(id) from tabel1;
max++;
insert into tabel1(id) values(max);
så har man to adskilte SQLstatements, hvor der er mulighed for en anden tråd/proces at læse og opdater imellem dem, og skabe inkponsistens.

Men hvad hvis man laver én statement ala
insert into tabel1(id) values ((select max(id) from tablel1)+1);
Har man så elimineret samtidighedsproblemet, eller kan der stadig snige sig andre tråde ind mellem den ydre INSERT og sub-SELECTen?
Avatar billede arne_v Ekspert
03. november 2007 - 02:05 #1
Det tror jeg.

http://dev.mysql.com/books/mysqlpress/mysql-tutorial/ch10.html

siger:

A single update statement in MySQL is always atomic. It cannot be interrupted by another query or half succeed. It will complete or will completely fail on an error.

og jeg vil tro at det samme gælder for INSERT.

PS: du bør stadig bruge last_insert_id() !!!!

2) D
Avatar billede arne_v Ekspert
03. november 2007 - 02:06 #2
Og førend du starter med at google - den sidste glyf var ikke en smiley men kun editerings rester
Avatar billede arne_v Ekspert
03. november 2007 - 02:15 #3
Hmm.

Jo mere jeg tænker over det - jo mere usikker bliver jeg overfor om den fortolkning
ovenfor holder vand.
Avatar billede arne_v Ekspert
03. november 2007 - 02:18 #4
http://www.ftponline.com/vsm/2003_06/online/hottips/nilsson2/

er for SQLServer, men jeg tror faktisk at det samme gælder for MySQL.
Avatar billede speedpete Nybegynder
04. november 2007 - 10:07 #5
Ja, okay, nu er vi så nede i kernepartikel-størrelse, for at drage en analogi til fysik.

Kan man forstå det sådan, at
1. de mindste ubrydelige enheder er SELECT, UPDATE, INSERT, DELETE
2. implicit fortolkes en sådan enhed, f.eks. SELECT, som:
  * begin transaction;
  * SELECT;
  * end transaction;
3. Alle statements er pr. definition transaktioner.
4. To på hinanden følgende statements er ikke én transaktion medmindre man eksplicti angiver det:
  * begin transaction;
  * SELECT;
  * UPDATE;
  * end transaction;
5. Dvs. hver gang man har at gøre med mere end én enhed (SELECT, UPDATE, INSERT, DELETE) - enten i en eksplicit defineret tranaktion, eller som en sub-select, eller bare løse statemtents - har man i princippet problemet med at tage stilling til, om andre tråde/processer kan/må komme imellem.
Avatar billede arne_v Ekspert
04. november 2007 - 23:10 #6
Det lyder rigtigt.
Avatar billede speedpete Nybegynder
06. november 2007 - 08:27 #7
Jeg samler det hele i http://www.eksperten.dk/spm/803519
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester