ããä¸é¢ï¼å°å©ç¨MySQLç客æ·ç«¯ç¨åºï¼åå«æµè¯å ç§é离级å«ãæµè¯æ°æ®åºä¸ºtestï¼è¡¨ä¸ºtxï¼è¡¨ç»æï¼
ããid int
ããnum
ããint
ãã两个å½ä»¤è¡å®¢æ·ç«¯åå«ä¸ºAï¼Bï¼ä¸ææ¹åAçé离级å«ï¼å¨B端修æ¹æ°æ®ã
ããï¼ä¸ï¼ãå°Açé离级å«è®¾ç½®ä¸ºread uncommitted(æªæ交读)
ããå¨Bæªæ´æ°æ°æ®ä¹åï¼
ãã客æ·ç«¯Aï¼
ããBæ´æ°æ°æ®ï¼
ãã客æ·ç«¯Bï¼
ãã客æ·ç«¯Aï¼
ããç»è¿ä¸é¢çå®éªå¯ä»¥å¾åºç»è®ºï¼äºå¡Bæ´æ°äºä¸æ¡è®°å½ï¼ä½æ¯æ²¡ææ交ï¼æ¤æ¶äºå¡Aå¯ä»¥æ¥è¯¢åºæªæ交记å½ãé æè读ç°è±¡ãæªæ交读æ¯æä½çé离级å«ã
ããï¼äºï¼ãå°å®¢æ·ç«¯Açäºå¡é离级å«è®¾ç½®ä¸ºread committed(å·²æ交读)
ããå¨Bæªæ´æ°æ°æ®ä¹åï¼
ãã客æ·ç«¯Aï¼
ããBæ´æ°æ°æ®ï¼
ãã客æ·ç«¯Bï¼
ãã客æ·ç«¯Aï¼
ããç»è¿ä¸é¢çå®éªå¯ä»¥å¾åºç»è®ºï¼å·²æ交读é离级å«è§£å³äºè读çé®é¢ï¼ä½æ¯åºç°äºä¸å¯éå¤è¯»çé®é¢ï¼å³äºå¡Aå¨ä¸¤æ¬¡æ¥è¯¢çæ°æ®ä¸ä¸è´ï¼å 为å¨ä¸¤æ¬¡æ¥è¯¢ä¹é´äºå¡Bæ´æ°äºä¸æ¡æ°æ®ãå·²æ交读åªå 许读åå·²æ交çè®°å½ï¼ä½ä¸è¦æ±å¯éå¤è¯»ã
修改方法
有两种方法可以对配置了 systemd 的程序进行资源隔离:1. 命令行修改:通过执行 systemctl set-property 命令实现,形式为 systemctl set-property name parameter=value;修改默认即时生效。2. 手工修改文件:直接编辑程序的 systemd unit file 文件,完成之后需手工执行 systemctl daemon-reload 更新配置,并重启服务 systemctl restart name.service。
systemd unit file 里支持的资源隔离配置项,如常见的:
CPUQuota=value
该参数表示服务可以获取的最大 CPU 时间,value 为百分数形式,高于 100% 表示可使用 1 核以上的 CPU。与 cgroup cpu 控制器 cpu.cfs_quota_us 配置项对应。
MemoryLimit=value
该参数表示服务可以使用的最大内存量,value 可以使用 K, M, G, T 等后缀表示值的大小。与 cgroup memory 控制器 memory.limit_in_bytes 配置项对应。
事务的4种隔离级别
READ UNCOMMITTED 未提交读,可以读取未提交的数据。
READ COMMITTED 已提交读,对于锁定读(select with for update 或者 for share)、update 和 delete 语句,InnoDB 仅锁定索引记录,而不锁定它们之间的间隙,因此允许在锁定的记录旁边自由插入新记录。
Gap locking 仅用于外键约束检查和重复键检查。
REPEATABLE READ 可重复读,事务中的一致性读取读取的是事务第一次读取所建立的快照。
SERIALIZABLE 序列化在了解了 4 种隔离级别的需求后,在采用锁控制隔离级别的基础上,我们需要了解加锁的对象(数据本身&间隙),以及了解整个数据范围的全集组成。
数据范围全集组成
SQL 语句根据条件判断不需要扫描的数据范围(不加锁);
SQL 语句根据条件扫描到的可能需要加锁的数据范围;
以单个数据范围为例,数据范围全集包含:(数据范围不一定是连续的值,也可能是间隔的值组成)