|
Posted by Jim Michaels on 04/24/06 07:21
"Jim Michaels" <NOSPAMFORjmichae3@yahoo.com> wrote in message
news:4s2dnQmJ8Ipb3tHZRVn-tg@comcast.com...
>
> "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.
nope. table locking didn't work either. :-( i'm out of ideas. PHP has no
access to the UNIX system-level-like getuuid() function that I can use in
place of a random number generator. that would have been perfect.
There must be some way of doing a wrapping counter that works like a web
counter (exclusive access at transaction time).
>
>
>>>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]
|