Tilted Forum Project Discussion Community  

Go Back   Tilted Forum Project Discussion Community > Interests > Tilted Technology


 
 
LinkBack Thread Tools
Old 02-27-2004, 11:31 AM   #1 (permalink)
Insane
 
[PHP - MySQL] Concept question...

I'm designing a database system for monitoring/tracking service calls. Currently, there's about 6 users. However, in a few weeks, it should come out of beta and go live with 50 or so...

Here's my issue: if two (or more) people are editing the same call at the same time, whomever hits "update" last, wins. Their information overwrites everyone elses.

How do I get around this? I don't want to actually lock the row by switching to InnoDB...our current system does that, and people always somehow screw up the exit process and the row stays locked until someone with direct access can fix it.

I'd like to do something like forums do...where they show you "Users currently browsing this forum". I have it figured out how to deal with that on the way in, easy enough. How do I get the site to figure out when they exit a call using the back button, or simply closing the browser?

I suppose eventually I'll download an open-source forum and take a look at the code to see what I can figure out.

Anyone have a better idea (I'm sure)?

Thanks
MPEDrummer
__________________
My sig can beat up your honor student.
mpedrummer2 is offline  
Old 02-27-2004, 12:10 PM   #2 (permalink)
Psycho
 
So you have a ticket that has been entered.

Are you assigning those tickets ? If so, problem solved, the responsible party updates/closes the ticket.

If not, maybe you should have techs take ownership of the ticket, so that only one tech/person can edit it at a time.

I, on the other hand, have a ticket system where it stacks the replies, similiar to a msgboard, until the ticket is closed. If Joe closes the ticket while frank is still updating, then frank goes to hit update, it returns with an error stating that this ticket was already closed by Joe.

Or, you could get complicated, and track sessions to pages to show that someone is currently viewing, then have a process that timesout inactive sessions.

I don't allow users to hit the back button, simply by replacing the last page in the users history with the current page being viewed, then as an extra measure, having all pages set to expire -1d.

Hope this helps, sounds like fun.
Mephex is offline  
Old 02-27-2004, 12:18 PM   #3 (permalink)
kel
WARNING: FLAMMABLE
 
Location: Ask Acetylene
You will not get the synchronization you desire from a web browser, I really think that PHP is a bad way to implement the interface for your database.

Sounds like it's to late to switch, but it would be much easier to setup a client server system if you didn't have such a weak client (browser).

Your problem is that HTTP connections are
stateless. We get around that with sessions and cookies, but they don't provide the fine grained synchronization you require. The browser can close and the webserver won't know, The best you can do is timeouts.

As for forums, well... those "whose browsing" scripts are usually very inaccurate.

Do it in Java... JSP server engine, Full on swing client, it won't be as responsive client side as some other combinations (graphically), but the server will run VERY efficiently and the clients probably have the horsepower to spare.
__________________
"It better be funny"
kel is offline  
Old 02-27-2004, 01:36 PM   #4 (permalink)
Insane
 
You're right, too late to change.

The clients don't have the horsepower to spare (sadly) and IT has disabled Java on most of them anyway.

I should probably be a little more clear...these aren't tickets like "fix my email", this is a company that provides onsite service 24x7 for servers, printers, terminals, whatever. The system stores client contact information, which is what is most likely to change. Often, we're finding that the area code is wrong, that sort of thing.

The current system locks the record on access, but doesn't tell you WHO locked the record. This results in people paging across the intercom all pissed off yelling "whoever's in call 2222222, get out so I can order a part!" It's an issue when someone in the other building leaves for the day and has a call open...that's why I'm looking for a system that simply advises that someone else is in, and tells you who so you can go smack them.

Beh...

MPEDrummer
__________________
My sig can beat up your honor student.
mpedrummer2 is offline  
Old 03-01-2004, 05:13 AM   #5 (permalink)
Psycho
 
Location: Boston, MAss., USA
Yea, the problem isn't your interface, it's your database. MySQL is really a flat file system with a SQL front end, so there's not a lot you can do there.. You might think about implementing postgreSQL as an alternative, which might be able to support the per-user record locking & report that back on query. I know that Oracle would do it without question, but that's definitely $$$ beyond.
__________________
I'm gonna be rich and famous, as soon I invent a device that lets you stab people in the face over the internet.
JohnnyRoyale is offline  
Old 03-02-2004, 05:48 AM   #6 (permalink)
Too hot in the hot tub!
 
pixelbend's Avatar
 
I'm not sure why you just couldn't add a boolean field to the table called "locked". Add a script in your php code to change this to true when a ticket is opened and move it to false after it is updated. You could even carry the userid to another feild and display who has the record currently locked.

Am I thinking too simplistic here?
__________________
But I don't want ANY Spam!
pixelbend is offline  
Old 03-03-2004, 01:07 AM   #7 (permalink)
Insane
 
No, you're right where I was.

Here's my problem...if the user simply closes the browser after the field is set to locked, it's locked until someone notices and goes in to fix it.

How do I unlock it when the session expires? More importantly, if the user has multiple browsers open on the site and closes one, the session won't end until ALL browser windows are closed, or in the instance of Firefox or anything else with tabbed browsing, the session wouldn't end until the broswer is closed, not just the individual tab.

Is there a way to trigger events when a session ends? I know there's a good way to do this, or at least a pretty decent one.

MPEDrummer
__________________
My sig can beat up your honor student.
mpedrummer2 is offline  
Old 03-05-2004, 06:23 AM   #8 (permalink)
Crazy
 
Location: Pittsburgh
I really don't know for sure with PHP, but I know that in ASP, you can fire a on_session_end function to clean up what the user has done. I'm hoping that something like this exists for PHP seeing a project that I'm planning really requires it.
gigawatz is offline  
Old 03-05-2004, 11:22 AM   #9 (permalink)
Insane
 
I'll keep you posted when I find something out.
__________________
My sig can beat up your honor student.
mpedrummer2 is offline  
Old 03-09-2004, 11:16 AM   #10 (permalink)
Rookie
 
cliche's Avatar
 
Location: Oxford, UK
Is it worth making use of Javascript? I use Javascript a fair bit to allow an RPC-type behaviour with my databases; you should be able to make the browser fire something off at the server as it closes?
__________________
I can't understand why people are frightened of new ideas. I'm frightened of the old ones. -- John Cage (1912 - 1992)
cliche is offline  
Old 03-10-2004, 11:15 PM   #11 (permalink)
Crazy
 
Location: Salt Town, UT
Keep it server side

Don't ever rely on sessions dying and actually being dead. A lot of times, I start a session, half edit something, head out to lunch, come back, finish the edit and click submit. So what you really need is mid-air collision detection on the server, which is actually fairly easy to accomplish without ever having to worry about sessions.

How you get this is by saving the state of the row in the first page (FORM page), passing that state to the second page (WORK page) and having the second page make sure that state still matches up when it submits.

There are two simple approaches to doing this. The first (which is the easiest to code for, but pretty hard to implement because of all of the database changes), is to tack on a TIMESTAMP column (or your local database equivalent) to the table you are worried about. When you pull up the record in the FORM, also pull up the TIMESTAMP and store it in a hidden varible. When it comes to the WORK page, do your update as usual but add an additional WHERE clause to check that the timestamp is the same as the timestamp that was passed from the FORM page. Check how many rows were updated, if there were 0, you just had a mid-air collision, or the user didn't make any changes and the database noticed that fact.

The second, which is harder to code for but requires no database changes, looks a lot like the first, except that you either pass the whole row through a hidden varible, or a checksum of a serialized version of the row. If you pass a checksum, you either have to lock the tables and manually check the checksum on the WORK page, or have your SQL daemon generate the checksum internally (in a format that could be used for a WHERE clause in an UPDATE statement)
Rawb is offline  
Old 03-11-2004, 09:51 AM   #12 (permalink)
Insane
 
Actually, that's the most reasonable solution yet.

Thanks.

I'm even using timestamps already, so that wouldn't require database modification at all.
__________________
My sig can beat up your honor student.
mpedrummer2 is offline  
Old 03-11-2004, 04:48 PM   #13 (permalink)
Darth Papa
 
ratbastid's Avatar
 
Location: Yonder
Quote:
Originally posted by pixelbend
I'm not sure why you just couldn't add a boolean field to the table called "locked".
Or even better, a field called "locked_by", containing the user ID of the user who currently has it locked. That way if you pull up a record you can alert that it's locked by Joe over there, and instruct the user to go whack Joe on the back of the head with a phone book.

Quote:
Originally posted by aoeuhtns
There are two simple approaches to doing this. The first (which is the easiest to code for, but pretty hard to implement because of all of the database changes), is to tack on a TIMESTAMP column (or your local database equivalent) to the table you are worried about. When you pull up the record in the FORM, also pull up the TIMESTAMP and store it in a hidden varible. When it comes to the WORK page, do your update as usual but add an additional WHERE clause to check that the timestamp is the same as the timestamp that was passed from the FORM page. Check how many rows were updated, if there were 0, you just had a mid-air collision, or the user didn't make any changes and the database noticed that fact.
That's a really nice approach. The only thing that's missing from it is advance warning that your data is about to go poof. It protects the database from clobber, but doesn't save the user the grief of having to pull up the newly-modified record, reenter their changes (reconciling their data with the other user's new data), and save again--and hope that they got the lock THIS time!

Personally, as a user, I'd rather know up front: hey, here's the record you just queried for, but that guy across the room is already editing it. Go talk to him, wouldja?
ratbastid is offline  
Old 03-15-2004, 04:23 PM   #14 (permalink)
Insane
 
Quote:
Or even better, a field called "locked_by", containing the user ID of the user who currently has it locked. That way if you pull up a record you can alert that it's locked by Joe over there, and instruct the user to go whack Joe on the back of the head with a phone book.
see, that's where I started...phone books and all. Problem is, when that jackass Joe doesn't log out of the system, but simply closes the browser instead, the call stays locked by Joe.

Hence the circle of crap I'm currently stuck in.
__________________
My sig can beat up your honor student.
mpedrummer2 is offline  
Old 03-17-2004, 12:39 PM   #15 (permalink)
Crazy
 
Location: Bit Bucket
Could you try setting it up so that the ticket keeps track of the Session ID that is working on it? Then have a cronjob that runs every 5 minutes that verifies that a Session is still active, and if not, it'll remove the Session ID from the table and let someone else get back to work on it.
devnull is offline  
 

Tags
concept, mysql, php, question


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT -8. The time now is 02:29 PM.

Tilted Forum Project

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Search Engine Optimization by vBSEO 3.6.0 PL2
© 2002-2012 Tilted Forum Project

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360