This just absolutely amazes me.
RJ Writes, "When I first began working at the company in question, I was trying to get a handle on the flow of database queries during a fund transfer, so I enabled query logging, and stepped through an example transaction. (Platform, PHP/MySQL on Linux). For any who read this: DON'T PANIC - the system never saw real production use until after it was completely revamped in a proper DBMS.
Order of SQL Queries for "Dispatcher sending funds" transaction:
Example transaction: customer sends funds from US location to overseas location in Buenos Aires, Argentina, which will then disburse the money to a 3rd party.
1. user logs in: (POST from /php/dispatcher_log.php to /php/members.php, redirects to /forms/welcome.php upon success) a. select from 'uaccount' b. insert into 'session', 'log' c. select from 'profile' (didn't bother with details on these queries)
2. user clicks on 'Dispatcher' (/forms/dispatcher_menu.php) a. select email, balance,available,type from uaccount where uid=2192 b. select valid from bankinfo where uid=2192 c. select email, balance,available,type from uaccount where uid=2192 d. select date_format(curdate(),'%W, %M %D, %Y')
3. user clicks on 'Sending Money' (/php/dispatcher_tx-1.2.php)
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp`
c. insert into Dispatchers_tmp (tid) values('0351634373');
d. select tid from Dispatchers_tmp where tid='0351634373'
e. select * from Dispatchers_tmp where tid='0351634373'
f. select * from Dispatchers_tmp where tid='0351634373'
g. select disp_rx_id from Dispatchers_tmp where tid='0351634373'
h. select email, balance,available,type from uaccount where uid=2192
i. select valid from bankinfo where uid=2192
j. select email, balance,available,type from uaccount where uid=2192
k. select date_format(curdate(),'%W, %M %D, %Y')
4. user enters remote location (ZIP or city!?! -- isn't there a better way?)
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp`
c. select tid from Dispatchers_tmp where tid='0351634373'
d. select profile.* from profile
left join uaccount on profile.uid = uaccount.uid
where (city like '%Buenos Aires%' or zipcode like '%Buenos Aires%')
and uaccount.type='102' and uaccount.uid <> 2192
e. select email, balance,available,type from uaccount where uid=2192
f. select valid from bankinfo where uid=2192
g. select email, balance,available,type from uaccount where uid=2192
h. select date_format(curdate(),'%W, %M %D, %Y')
5. user clicks on a remote dispatcher (still at /php/dispatcher_tx-1.2.php)
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp`
c. select tid from Dispatchers_tmp where tid='0351634373' (keeps state of last transaction # even after logout/login)
d. update Dispatchers_tmp set disp_rx_id ='2191' where tid='0351634373'
e. select profile.* from profile
left join uaccount on profile.uid = uaccount.uid
where (city like '%%' or zipcode like '%%')
and uaccount.type='102' and uaccount.uid <> 2192
f. select email, balance,available,type from uaccount where uid=2192
g. select valid from bankinfo where uid=2192
h. select email, balance,available,type from uaccount where uid=2192 (again?)
i. select date_format(curdate(),'%W, %M %D, %Y')
6. (Again!? must be a page refresh here, to dispatcher_tx-1.2.php?action=amount, because everything starts again)
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp'
c. select tid from Dispatchers_tmp where tid='0351634373'
d. select * from Dispatchers_tmp where tid='0351634373'
e. select * from Dispatchers_tmp where tid='0351634373'
f. select disp_rx_id from Dispatchers_tmp where tid='0351634373'
g. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=2191
h. select amount from Dispatchers_tmp where tid='0351634373'
i. select sender_id from Dispatchers_tmp where tid='0351634373'
j. select receptor_id from Dispatchers_tmp where tid='0351634373'
k. select email, balance,available,type from uaccount where uid=2192
l. select valid from bankinfo where uid=2192
m. select email, balance,available,type from uaccount where uid=2192
n. select date_format(curdate(),'%W, %M %D, %Y')
7. user enters amount, submits (to /php/dispatcher_tx-1.2.php?action=search_sender)
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp'
c. select tid from Dispatchers_tmp where tid='0351634373'
d. select * from Dispatchers_tmp where tid='0351634373'
e. select * from Dispatchers_tmp where tid='0351634373'
f. select disp_rx_id from Dispatchers_tmp where tid='0351634373'
g. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=2191
h. update Dispatchers_tmp set amount = 34 where tid = '0351634373';
i. select amount from Dispatchers_tmp where tid='0351634373'
j. select sender_id from Dispatchers_tmp where tid='0351634373'
k. select receptor_id from Dispatchers_tmp where tid='0351634373'
l. select email, balance,available,type from uaccount where uid=2192
m. select valid from bankinfo where uid=2192
n. select email, balance,available,type from uaccount where uid=2192
o. select date_format(curdate(),'%W, %M %D, %Y')
8. user enters new uaccount for receptor (submits to /php/dispatcher_tx-1.2.php)
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp` ...
c. select tid from Dispatchers_tmp where tid='0103252648'
d. LOCK TABLES uaccount WRITE
insert into uaccount values (null,'13jQ8ghw9b','[email protected]','13jQ8ghw9b','N',0,0,100,0,'0.20','0.20','0.02','0.20','')
UNLOCK TABLES
e. LOCK TABLES profile WRITE
insert into profile (uid,fname,lname,address1,address2,city,state,zipcode,countrycode,nphone,secretquestion,secretanswer)
values (3278,'tester','testingperson','123 Santander','','Buenos Aires','Argentina','00000','CO','011-456450546','uaccount opened by','2192')
UNLOCK TABLES
f. LOCK TABLES Dispatchers_tmp WRITE
update Dispatchers_tmp set receptor_id ='3278' where tid='0103252648'
UNLOCK TABLES
h. select * from Dispatchers_tmp where tid='0103252648'
i. select disp_rx_id from Dispatchers_tmp where tid='0103252648'
j. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=2191
k. select amount from Dispatchers_tmp where tid='0103252648'
l. select sender_id from Dispatchers_tmp where tid='0103252648'
m. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=3277
n. select receptor_id from Dispatchers_tmp where tid='0103252648'
o. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=3278
p. select email, balance,available,type from uaccount where uid=2192
q. select valid from bankinfo where uid=2192
r. select email, balance,available,type from uaccount where uid=2192
s. select date_format(curdate(),'%W, %M %D, %Y')
9. (I guess page re-directs, because it starts all over again:)
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp` (
c. select tid from Dispatchers_tmp where tid='0103252648'
d. select * from Dispatchers_tmp where tid='0103252648'
e. select * from Dispatchers_tmp where tid='0103252648'
f. select disp_rx_id from Dispatchers_tmp where tid='0103252648'
g. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=2191
h. select amount from Dispatchers_tmp where tid='0103252648'
i. select sender_id from Dispatchers_tmp where tid='0103252648'
j. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=3277
k. select receptor_id from Dispatchers_tmp where tid='0103252648'
l. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=3278
m. select email, balance,available,type from uaccount where uid=2192
n. select valid from bankinfo where uid=2192
o. select email, balance,available,type from uaccount where uid=2192
p. select date_format(curdate(),'%W, %M %D, %Y')
10. (and I guess page re-directs again, ending up at /php/dispatcher_tx-1.2.php?action=confirm)
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp` (...
c. select tid from Dispatchers_tmp where tid='0103252648'
d. select * from Dispatchers_tmp where tid='0103252648'
e. select disp_rx_id from Dispatchers_tmp where tid='0103252648'
f. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=2191
g. select amount from Dispatchers_tmp where tid='0103252648'
h. select sender_id from Dispatchers_tmp where tid='0103252648'
i. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=3277
j. select receptor_id from Dispatchers_tmp where tid='0103252648'
k. select profile.fname,profile.mname,profile.lname,profile.address1,profile.address2,profile.city,profile.zipcode,uaccount.email
from profile LEFT JOIN uaccount ON profile.uid=uaccount.uid where uaccount.uid=3278
l. select email, balance,available,type from uaccount where uid=2192
m. select valid from bankinfo where uid=2192
n. select email, balance,available,type from uaccount where uid=2192
o. select date_format(curdate(),'%W, %M %D, %Y')
11. Now, from here we have the final "sending" confirmation (POSTs either $submit or $delete to //php/dispatcher_tx-1.2.php)
(redirects to printing page, and then back to beginning "Send" form.)
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp` (...
c. select tid from Dispatchers_tmp where tid='0103252648'
d. select * from Dispatchers_tmp where tid='0103252648'
e. select uaccountno from uaccount where uid='2192'
f. select uaccountno from uaccount where uid='2191'
g. LOCK TABLES trans WRITE
insert into trans values(null,'0103252648','6GjSid8KoJ','34f9YC78AZ','0102',42.45,'USD',20020128122249,null,'Y',null)
UNLOCK TABLES
h. LOCK TABLES uaccount WRITE
update uaccount set balance=balance-42.45,available=available-42.45 where uid=2192
UNLOCK TABLES
i. LOCK TABLES uaccount WRITE
update uaccount set balance=balance+42.45,available=available+42.45 where uid=2191
UNLOCK TABLES
j. LOCK TABLES trans WRITE
insert into trans values(null,'0103252648','6GjSid8KoJ','34f9YC78AZ','0102',1,'USD',20020128122249,null,'Y',null)
UNLOCK TABLES
k. LOCK TABLES uaccount WRITE
update uaccount set balance=balance-1,available=available-1 where uid=2192
UNLOCK TABLES
l. LOCK TABLES uaccount WRITE
update uaccount set balance=balance+1,available=available+1 where uid=2191
UNLOCK TABLES
m. LOCK TABLES trans WRITE
insert into trans values(null,'0103252648','6GjSid8KoJ','TESTAC0002','0102',1,'USD',20020128122249,null,'Y',null)
UNLOCK TABLES
n. LOCK TABLES uaccount WRITE
update uaccount set balance=balance-1,available=available-1 where uid=2192
UNLOCK TABLES
o. LOCK TABLES dispatchers_trans WRITE, Dispatchers_tmp READ
insert into dispatchers_trans select * from Dispatchers_tmp where tid='0103252648'
UNLOCK TABLES
p. select * from dispatchers_trans where RemID='123'
q. select * from profile where uid=2192
r. select * from profile where uid=2191
s. select * from profile where uid=3277
t. select * from profile where uid=3278
u. select * from uaccount where uid=2192
v. select * from uaccount where uid=2191
w. select * from uaccount where uid=3277
x. select * from uaccount where uid=3278
y. select * from uaccount where uid=3278
z. select date_format('20020128122249','%M %d, %Y %H:%i:%s')
zz.select date_format('','%M %d, %Y %H:%i:%s')
12. Re-direct to printing page a. select type from uaccount where uid=2192 b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp` (... c. select tid from Dispatchers_tmp where tid='0103252648' d. select * from Dispatchers_tmp where tid='' e. select * from Dispatchers_tmp where tid='' f. select disp_rx_id from Dispatchers_tmp where tid='' g. select email, balance,available,type from uaccount where uid=2192 h. select valid from bankinfo where uid=2192 i. select email, balance,available,type from uaccount where uid=2192 j. select date_format(curdate(),'%W, %M %D, %Y')
13. Re-direct back to main "Sending" page
a. select type from uaccount where uid=2192
b. CREATE TABLE IF NOT EXISTS `Dispatchers_tmp` (...
c. select tid from Dispatchers_tmp where tid='0351454703'
d. LOCK TABLES Dispatchers_tmp WRITE
insert into Dispatchers_tmp (tid) values('0351454703')
update Dispatchers_tmp set disp_tx_id ='2192' where tid='0351454703'
UNLOCK TABLES
e. select * from Dispatchers_tmp where tid='0351454703'
f. select * from Dispatchers_tmp where tid='0351454703'
g. select disp_rx_id from Dispatchers_tmp where tid='0351454703'
h. select email, balance,available,type from uaccount where uid=2192
i. select valid from bankinfo where uid=2192
j. select email, balance,available,type from uaccount where uid=2192
k. select date_format(curdate(),'%W, %M %D, %Y')
Final count: 134 SELECT statements 26 LOCK TABLE statements 11 CREATE TABLE statements 9 INSERT statements 9 UPDATE statements
Note: it might also be amusing to also bear in mind that "tid", or Transaction ID, was not an auto-generated number in the database, since the DB designer elected not to create a table for master records and a sub-table for actual monetary value transfers. Thus, the major 'trans' table ended up with at least 3 rows for any one transaction, ERGO, you could not make "tid" an auto-generated primary key. They settled for a nifty little PHP function which would generate a text string of 10 random digits. Well, actually it was only 9 random digits, because the first digit always returned as "0". By the time I arrived, they were already getting corruption from duplicate transaction IDs.