|
Posted by Jim Michaels on 04/24/06 06:19
"Gordon Burditt" <gordonb.bly5h@burditt.org> wrote in message
news:124m82q9ka7mua8@corp.supernews.com...
> >mysql_query("START TRANSACTION", $link2);
>>$q2=mysql_query("SELECT pictures.pid AS pid
>> FROM pictures,counter
>> WHERE pictures.pid>counter.pid
>> LIMIT 1", $link2);
>>if ($row2=mysql_fetch_assoc($q2)) {
>> mysql_query("UPDATE counter SET pid=$row2[pid]", $link2);
>> $n=$row2['pid'];
>>} else { //reached end of table.
>> mysql_query("UPDATE counter SET pid=1", $link2);
>> $n=1;
>>}
>>mysql_free_result($q2);
>>mysql_query("COMMIT", $link2);
>
> Check to see whether your queries WORK. If they do not work,
> print out the query and the value of mysql_error(). (For actual
> production code, log it somewhere the user won't see it).
>
well, adding the transaction didn't affect *anything*. so I'm thinking
wrong somewhere.
my guess was that instance B and instance A had both read the same value at
nearly the same time, UPDATEd with the same value as a result. a race
condition. I had *thought* a transaction would fix that, but obviously
there's something about transactions I don't understand. I couldn't get
table locking (counter READ) to work - it just gave me invalid resource
errors down the line on my queries. I've never used table locking in PHP
code before.
If I could get table locking going, maybe that would be the fix to my
problem.
>>the transaction makes no difference in the outcome.
>
> The transaction may be counterproductive. For certain applications,
> having uncommitted changes be NOT visible to other connections until
> they are committed can bite you big time. One example of this is
> the "last modified" timestamp being used to identify recently changed
> stuff, to actually make the changes in the real world (e.g. create
> mailboxes). When it can take a long time to commit a transaction,
> the "last modified" date can go from months old to hours old without
> ever having been only a few minutes old, fooling provisioning software
> trying to see all the changes and not miss any.
Good to know. as far as I can tell, the updates are occurring.
>
>>I've even tried locking the tables, but that only results in invalid
>>resource errors.
>
> Then find out why your query didn't work, and fix it (print
> mysql_error() for the failing query). You need to lock ALL the
> tables you're going to use, and if you use aliases, you may have
> to lock them under the name of the alias.
>
>>when this picture code is called twice in sequence, (2 separate
>>interpreters, possibly by separate processors), I get the same image. I
>>shouldn't be getting the same image twice. this is one of those
>>hair-pulling sessions.
>>
>>Everything I've tried results either in no pictures at all (picture
>>placeholders)
>
> Please explain how that can happen in terms of the generated HTML.
> Are you generating numbers for which there is no image file?
>
>>with both the same sizes due to errors, or with the same
>>pictures on the same page.
>>
>>transactions, no transactions, using a counter is out of the question.
>>I don't understand what's even happening here. the transaction *should*
>>fix
>>this! Am I missing something
>
> Gordon L. Burditt
Navigation:
[Reply to this message]
|