个人博客
https://blog.youkuaiyun.com/cPen_web
Session是什么?
会话:创建一个连接 --> 建立了一个会话
长连接:一直的连着不断开,除非人为的关闭 --> mysql和ssh连接
短连接:先建立3次握手 --> 传输数据 --> 四次断开
root@test mysql>show processlist; #注:查看有哪些人连接(几个session)
#注:一个连接里面创建很多的事务
buffer:缓存
仍然是一个临时存放数据的地方(写操作)
内存 --> buffer --> 磁盘
cache:缓存
读操作 临时存放数据的地方
磁盘 --> cache --> 内存
缓存的作用确实起到加速的作用,特别是cache
减少系统CPU和进程、内存资源的消耗
本质上,从进程的调度来思考
作用:节约资源;频繁io影响系统性能(操作系统层面分析;进程方面考虑)
数据的修改都是在内存中进行的(缓冲池)
缓冲池大小 最大 内存的80%
page页
buffer pool是mysql内部的的缓存池,相当于mysql内部存放数据的地方
buffer pool最大的大小可以到达整个物理内存的80%
root@(none) mysql>show variables like "innodb_buffer_pool_size";
| Variable_name | Value |
| innodb_buffer_pool_size | 536870912 |
Buffer Pool LRU Algorithm
LRU算法
最近最少使用算法
LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰
页化(page)(内存里的单位)
mysql里1页 16k
磁盘 文件系统的块 默认4k
脏读
mysql里不允许脏读,因为事务是隔离的
其它用户(事务)不能查看当前用户(事务)所做的DML操作的结果。这叫做不允许脏读(dirty read)
脏读:一个事务读到了另一个事务未提交的数据
已修改但未提交的数据叫做赃数据(注:脏数据在内存中)
表中受影响的行被锁定,其它用户(事务)不能在受影响的行上修改数据
锁
锁
颗粒度
表锁
行锁 innodb
行为
读锁 备份的时候
写锁 lock tables t1 write;
共享锁
排他锁
为什么要加锁?
大并发情况下,为了保持数据的一致性。需要对资源进行管控,需要使用锁,解决资源竞争的问题
死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
如何解决死锁?
1 .使用另外的程序来检查是否存在死锁,干预,杀死某些进程
2 .设计程序的时候,考虑获得条件的先后顺序
3 .队列
活锁
活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。
读锁 --> 读数据的时候,给某行加一个锁 备份的时候
写锁 --> 写数据的时候,给某行加一个锁 lock tables t1 write;
意向锁
共享锁 --> 读锁
互斥锁 --> 写锁
表锁
READ:当前会话和其它会话都可以读表,但是不能修改表
WRITE:当前会话可以读写表,但是其它会话既不能读也不能写
#示例:锁表 (写锁)
root@test mysql>lock tables t1 write;
#注:写锁是互斥锁,其他的会话不能查和写。写锁会影响到并发
#示例:把锁释放
root@test mysql>unlock tables;
#示例:查询时加锁 添加共享锁
root@test mysql>select * from t1 lock in share mode;
事务的4个问题
并发事务的4个问题
脏读
不可重复度
修改了数据 update
幻读
记录是不一样 insert或者delete
丢失更新
事务的4个隔离级别
每个事务都有一个隔离级别(isolation level),它规定了并发运行的两个事务之间是否允许发生上面的问题。
MySQL有4种事务隔离级别:
repeatable read 可重复读 默认级别
read committed 读已提交
read uncommitted 读未提交
serializable 串行化
查看数据库及当前会话的事务隔离级别(2种方法)
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
root@test mysql>SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
root@test mysql>show variables like "tx_isolation";
在配置文件中指定数据库的事务隔离级别
[mysqld]
transaction-isolation = REPEATABLE-READ
#示例:备份jd库
[root@cPen ~]# mysqldump -ucali -p'123456' jd >jd.sql
#示例:备份所有的数据库
[root@cPen ~]# mysqldump -h 192.168.31.165 -ucali -p'123456' --all-databases >jd.sql
#示例:备份TENNIS库
[root@cPen ~]# mysqldump -uroot -p'Sanchuang123#' --databases TENNIS >tennis.sql
root@test mysql>drop database TENNIS; #注:删除TENNIS库
#示例:导入TENNIS库
[root@cPen ~]# mysql -uroot -p'Sanchuang123#' <tennis.sql
#注:备份还原的时候 会锁表
事务处理 在Python代码里的经典应用
参考:https://www.runoob.com/python3/python3-mysql.html
Python pymysql操纵MySQL时,需要commit提交
#注:自动开启一个事务,自己需要敲db.commit()提交 利用事务 来处理往数据库里写数据
[root@cPen ~]# vim sc.py
import pymysql
# 打开数据库连接
db = pymysql.connect(host="192.168.31.165", user="cali", passwd="123456", db="test")
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = """INSERT INTO t1(id,name)
VALUES (300, 'yiyiqiang')"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
# 关闭数据库连接
db.close()
[root@cPen ~]# python3 sc.py
Python代码里,自动开启commit --> autocommit的开启
conn = pymysql.connect(
user = 'cali',
passwd = '123456',
db = 'test',
host = '127.0.0.1',
port = 3306,
charset = 'utf8',
autocommit = True # 自动提交确认

最低0.47元/天 解锁文章
1070

被折叠的 条评论
为什么被折叠?



