должны ли мы использовать уровень изоляции чтения-фиксации?

У меня есть таблица mysql innodb с именем «radacct». Эта таблица содержит записи об использовании Интернета пользователями, такие как загрузка, загрузка, идентификатор учетной записи и т. д. (схема таблицы ниже). Таблица radacct обновляется через случайные промежутки времени данными, отправляемыми маршрутизаторами. Мы также используем эту таблицу для расчета общей пропускной способности интернет-пользователя, а запрос расчета пропускной способности (выбор) занимает около 3-4 секунд. Проблема возникает при одновременном выполнении запроса на расчет пропускной способности и запроса на обновление от маршрутизаторов, конкурирующих за блокировки. Это связано с блокировкой RepeatableRead (блокировка на уровне таблицы) и лучше использовать здесь изоляцию ReadCommitted?

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)

Запрос расчета пропускной способности

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'

Запрос на вставку/обновление, замеченный на 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') 

person satch_boogie    schedule 23.08.2016    source источник


Ответы (1)


разница между RC и RR заключается в следующем: результат выбора изменится за одну транзакцию или нет;

поэтому в RR результат не изменится за одну транзакцию, если произойдет запрос на обновление;

Пример в РР:

сессия 1: 10:00:00 — открытие сделки;

сессия 1: 10:00:00 – выполнение запроса на расчет пропускной способности;

сессия 1: 10:00:08 — завершение запроса на расчет пропускной способности, результат = 100;

сеанс 2: 10:00:05 — запрос на обновление;

сессия 1: 10:00:09 – выполнение запроса на расчет пропускной способности;

сессия 1: 10:00:17 — завершение запроса на расчет пропускной способности, результат = 100;

сессия 1: 10:00:18 — завершение транзакции;

но с RC второй запрос расчета пропускной способности в примере даст другой результат, может 101;

если запрос обновления выполняется во время выполнения запроса расчета пропускной способности, ничего не меняется;

мое мнение: в данном случае и RC, и RR в порядке;

person Wang Wen'an    schedule 23.08.2016