From: Arne Vajhøj on
On 17-04-2010 07:54, Tom Anderson wrote:
> On Sun, 11 Apr 2010, Arne Vajh?j wrote:
>> On 07-04-2010 17:55, Tom Anderson wrote:
>>> On Wed, 7 Apr 2010, Lew wrote:
>>>> Arne Vajh?j wrote:
>>>>>>>> Especially with a high update ratio then an UPDATE with a WHERE and
>>>>>>>> only an INSERT if no rows were updated could be worth considering.
>>>>
>>>> Andreas Leitgeb wrote:
>>>>>>> Would it be safe? Or could one end up with two entries for that key,
>>>>>>> if the attempted updates happen at the same time?
>>>>
>>>> Martin Gregorie wrote:
>>>>>> Should be OK provided you use explicit commit units rather than
>>>>>> default automatic commits.
>>>>
>>>> Andreas Leitgeb wrote:
>>>>> "Should be ..." doesn't really sound too convincing in the context of
>>>>> possible concurrency problems ;-)
>>>>
>>>> If the database engine supports transactions and you remember to use
>>>> them, it will be safe.
>>>
>>> You mean, if it has them, you remember to use them, and you're happy to
>>> live with the consequences of using the serializable isolation level,
>>> you'll be safe.
>>>
>>> Being able to do an 'upsert' in a single atomic operation makes it
>>> possible to be safe much faster than having to do it with two queries.
>>
>> Why?
>
> Because you don't have to use serializable transaction isolation.
>
>> The UPSERT will more or less have to do the same thing. The fact that
>> it is one SQL command does not guarantee that it is more efficient.
>
> Perhaps not, but the effect of the transaction isolation level on
> concurrency is, AIUI, likely to be significant.

serializable transaction isolation level in this case basicly means a lock.

An UPSERT statement also needs to do a lock.

It is not obvious to me why the first lock is so much more
expensive that the second lock.

>> http://dev.mysql.com/doc/refman/5.0/en/replace.html
>>
>> <quote>
>> Performance considerations:
>
> Yeah, well, MySQL is MySQL. I wouldn't expect MySQL to behave like a
> real database. But anyway:
>
>> Also, check out INSERT ... ON DUPLIATE KEY UPDATE... as an alternative
>> if you're willing to stick to MySQL 4.1+
>> </quote>
>
> ON DUPLICATE KEY UPDATE is the standard way to do UPSERT on MySQL, and
> isn't covered by this dire warning.

No. But it still has to the work.

Arne