maria-discuss team mailing list archive
-
maria-discuss team
-
Mailing list archive
-
Message #01698
Re: newbie question
Roberto, Aria cannot lock rows. With SELECT FOR UPDATE you would get no errors (because MariaDB and MySQL, for some reason, don't like errors) but you would have no lock.
Lock the whole table, or switch to InnoDB. The standard isolation level guarantees the protection you need.
Federico
--------------------------------------------
El jue, 12/6/14, Roberto Spadim <roberto@xxxxxxxxxxxxx> escribió:
Asunto: Re: [Maria-discuss] newbie question
Para: "Pantelis Theodosiou" <ypercube@xxxxxxxxx>
CC: "Maria Discuss" <maria-discuss@xxxxxxxxxxxxxxxxxxx>
Fecha: jueves, 12 de junio, 2014 17:36
hi guys!
thaks for explanations and ideas, well the first problem is
ok, change to -1 and -2 and after 2 and 1, that was what
i'm considering at the first time i see primary key
duplicated, and since mysql don't suport defered
insert/update/delete, ok let's workaround :)
now the full
problem....think about a list with 'locked' and
'unlocked' positions, and important fields that make
that entry information unique... every position
(id column) must be >0, all positions <=0 i'm
considering as 'inserted but not completed
transition'
|id|locked|other important
data||1|false|blabla||2|false|blabla2||3|true|blabla3||4|false|blabla4||5|false|blabla5||6|true|blabla6|
my problem now is: change
it 5 to position 2, and reposition the list, position 2 will
become position 4, and position 4 will become position 5,
position 3 will not change since it's
locked='true'
i'm considering
something like, change position 5 to -5, change position 4
to 5, change position 2 to 4, change -5 to 2, but how to do
this only with sql language? and the second problem is:
change position 2 to position 5, position 4 will become
position 2, position 5 will become position 4
any other idea about how to
do this? i think that's the easiest way, considering
that i will need a lock at positions 2,3,4,5 before start
updates, right? maybe i could do this with select * from
test where id in (2,3,4,5) for update, or lock table
ideas are
wellcome
2014-06-12 8:32 GMT-03:00
Pantelis Theodosiou <ypercube@xxxxxxxxx>:
On Thu, Jun 12, 2014 at 9:57 AM,
Federico Razzoli <federico_raz@xxxxxxxx>
wrote:
Duplicate data cannot be
inserted in MariaDB, in no cases.
PostgreSQL has a different behaviour: transactions can
optionally be "deferred", which means that
integrity checks will be done on commit. This means that you
can temporarly insert inconsistent data, and fix them before
commit.The same option is available for foreign keys and
other features that I don't remember.
Correct. Standard
SQL behaviour is checking constraints at the end of a
statement. The optional ability to defer a constraint check
means that the check is done at the end of the transaction
and not at the end of statement. (Postgers and Oracle can do
that, SQL-Server does not.) No duplicate data will be
inserted either, in both cases, deferred or not constraints.
Any inconsistent data is only visible during the
transaction, by the transaction - with the MVCC model no
other transaction can see them before that one is
committed.
What MySQL and MariaDB does is
different than standard/common SQL behaviour, it is checking
the constraints after every row update. That is
causing the problem that Roberto faces.
But we are talking about MariaDB, so... what you can do, in
you example, is:
UPDATE ... SET id = NULL WHERE id = 1; -- does not exist,
right?
UPDATE ... SET id = 1 WHERE id = 2; -- change other
values
UPDATE ... SET id = 1 WHERE id IS NULL;
This is fine - as long as
there are not any NULL values already on the table in the id
column. If there are, the 3rd UPDATE will convert all of
them to 1. You can use negative values - of course if and
only if all your ids are either positive or NULL:
UPDATE ... SET id = -2 WHERE id = 1;
UPDATE ... SET id = -1 WHERE id = 2;
UPDATE ... SET id = -id WHERE id < 0;
This can easily be
extended for more complex updates and we only need two
UPDATE statements - and I suppose better inside a
transaction, for InnoDB engine:
UPDATE ...
SET id = CASE id
WHEN 1 THEN -2
WHEN 2 THEN -1
WHEN ...
END
WHERE id
IN (1,2) ;
UPDATE ... SET id = -id WHERE id < 0;
Pantelis
Or, if your case is more complex than this:
1) lock the table
2) drop the pk
3) update
4) unlock
Ciao
Federico
_______________________________________________
Mailing list: https://launchpad.net/~maria-discuss
Post to : maria-discuss@xxxxxxxxxxxxxxxxxxx
Unsubscribe : https://launchpad.net/~maria-discuss
More help : https://help.launchpad.net/ListHelp
_______________________________________________
Mailing list: https://launchpad.net/~maria-discuss
Post to : maria-discuss@xxxxxxxxxxxxxxxxxxx
Unsubscribe : https://launchpad.net/~maria-discuss
More help : https://help.launchpad.net/ListHelp
--
Roberto Spadim
SPAEmpresarialEng. Automação e
Controle
-----Adjunto en línea a continuación-----
_______________________________________________
Mailing list: https://launchpad.net/~maria-discuss
Post to : maria-discuss@xxxxxxxxxxxxxxxxxxx
Unsubscribe : https://launchpad.net/~maria-discuss
More help : https://help.launchpad.net/ListHelp
References