2016-08-23 5 views
0

Ich habe eine mysql innodb Tabelle namens "radacct". Diese Tabelle enthält die Nutzungsdatensätze des Benutzers wie Upload, Download, Account-ID usw. (Tabellenschema unten). Die Tabelle radacct wird in zufälligen Intervallen mit Daten aktualisiert, die von Routern gesendet werden. Wir verwenden diese Tabelle auch, um die Gesamtbandbreite des Internetbenutzers zu berechnen, und die Abfrage zur Bandbreitenberechnung (Auswahl) dauert etwa 3-4 Sekunden. Das Problem tritt auf, wenn die Bandbreitenberechnungsabfrage und die Aktualisierungsabfrage gleichzeitig von Routern ausgeführt werden, die um Sperren konkurrieren. Liegt das an RepeatableRead-Sperren (Sperrung auf Tabellenebene) und besser, ReadCommitted Isolation hier zu verwenden?sollten wir Read-Committed-Isolationsstufe verwenden?

describe freeradius.radacct; 
+----------------------+-------------+------+-----+---------+----------------+ 
| Field    | Type  | Null | Key | Default | Extra   | 
+----------------------+-------------+------+-----+---------+----------------+ 
| radacctid   | bigint(21) | NO | PRI | NULL | auto_increment | 
| acctsessionid  | varchar(32) | NO | MUL |   |    | 
| acctuniqueid   | varchar(32) | NO | MUL |   |    | 
| username    | varchar(64) | NO | MUL |   |    | 
| groupname   | varchar(64) | NO |  |   |    | 
| realm    | varchar(64) | YES |  |   |    | 
| nasipaddress   | varchar(15) | NO | MUL |   |    | 
| nasportid   | varchar(15) | YES |  | NULL |    | 
| nasporttype   | varchar(32) | YES |  | NULL |    | 
| acctstarttime  | datetime | YES | MUL | NULL |    | 
| acctstoptime   | datetime | YES | MUL | NULL |    | 
| acctsessiontime  | int(12)  | YES | MUL | NULL |    | 
| acctauthentic  | varchar(32) | YES |  | NULL |    | 
| connectinfo_start | varchar(50) | YES |  | NULL |    | 
| connectinfo_stop  | varchar(50) | YES |  | NULL |    | 
| acctinputoctets  | bigint(20) | YES |  | NULL |    | 
| acctoutputoctets  | bigint(20) | YES |  | NULL |    | 
| calledstationid  | varchar(50) | NO |  |   |    | 
| callingstationid  | varchar(50) | NO |  |   |    | 
| acctterminatecause | varchar(32) | NO |  |   |    | 
| servicetype   | varchar(32) | YES |  | NULL |    | 
| framedprotocol  | varchar(32) | YES |  | NULL |    | 
| framedipaddress  | varchar(15) | NO | MUL |   |    | 
| acctstartdelay  | int(12)  | YES |  | NULL |    | 
| acctstopdelay  | int(12)  | YES |  | NULL |    | 
| xascendsessionsvrkey | varchar(10) | YES |  | NULL |    | 
+----------------------+-------------+------+-----+---------+----------------+ 

mysql> show session variables like '%isol%'; 
+---------------+-----------------+ 
| Variable_name | Value   | 
+---------------+-----------------+ 
| tx_isolation | REPEATABLE-READ | 
+---------------+-----------------+ 
1 row in set (0.00 sec) 

Bandbreite Berechnung Abfrage

SELECT sum(acctinputoctets),sum(acctoutputoctets) from radacct 
where username='davidjohnsoon' and acctstarttime 
between '2015-10-11 14:10:17' and '2016-08-22 14:53:00' 

Insert/Abfrage-Update gesehen auf mysql> show full processlist;

INSERT INTO radacct (acctsessionid, acctuniqueid, username,   realm, nasipaddress, nasportid, nasporttype, acctstarttime, acctstoptime,acctsessiontime, acctauthentic, connectinfo_start, connectinfo_stop, acctinputoctets, acctoutputoctets, calledstationid, callingstationid, acctterminatecause,servicetype, framedprotocol, framedipaddress, acctstartdelay, acctstopdelay) 
VALUES ('260204248', 'a5b889ad247a514b', 'johnson', '','100.44.44.44', '297797794', 'Ethernet', DATE_SUB('2016-08-23 13:02:50',INTERVAL (1 + 0) SECOND), '2016-08-23 13:02:50', '1', 'RADIUS', '',    '', '0' << 32 | '0', '0' << 32 | '0','','90:61:0c:1a:94:96','User-Error','Framed-User', 'PPP', '','0', '0') 

Antwort

1

der Unterschied zwischen RC und RR ist: das Auswahlergebnis in einer Transaktion ändern wird oder nicht;

so in RR, das Ergebnis wird nicht in einer Transaktion ändern, wenn Update-Abfrage auftritt;

Beispiel in RR:

Session 1: 10: 00: 00-open eine Transaktion;

Sitzung 1: 10: 00: 00 - Ausführung der Abfrage zur Bandbreitenberechnung;

Sitzung 1: 10: 00: 08-Beenden der Abfrage der Bandbreitenberechnung, Ergebnis = 100;

Sitzung 2: 10: 00: 05-Update-Abfrage;

Sitzung 1: 10: 00: 09 - Ausführung der Abfrage zur Bandbreitenberechnung;

Sitzung 1: 10: 00: 17-beendet die Abfrage der Bandbreitenberechnung, Ergebnis = 100;

Sitzung 1: 10: 00: 18-Ende eine Transaktion;

aber mit RC, die zweite Abfrage der Bandbreite Berechnung in Beispiel wird das unterschiedliche Ergebnis, Mai 101;

Wenn die Aktualisierungsabfrage ausgeführt wird, während die Abfrage zur Bandbreitenberechnung ausgeführt wird, ändert sich nichts.

meine meinung: in diesem fall sind beide RC und RR OK;

Verwandte Themen