08_MySQL笔记-锁-常量-DISTINCT-DESC-WHERE

文章目录


个人博客
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    # 自动提交确认
以hive的角度检查语法: with cur_dim_comb as (SELECT DISTINCT t.dim_comb ,t.var_sub_class ,t.acc_value FROM gerp.cux_cst_data_alloc_his t WHERE t.top_var_type = '10' AND t.job_ver_id in (SELECT ver.job_ver_id AS p_job_ver_id FROM gerp.cux_cst_dist_jobs_all job INNER JOIN gerp.cux_cst_dist_jobs_vers_all ver ON job.job_id = ver.job_id )) select tp.bd_code --事业部编码 ,tp.bd_name --事业部名称 ,hp.ou_code --OU名称 ,hp.ou_name --OU编码 ,op.main_class_desc --差异大类 ,op.acc_value --科目代码 ,op.acc_desc --科目名称 ,op.dim_comb --区分维度 ,op.begin_amount --期初余额 ,op.accrual_amount --本期发生 ,op.balance_diff_alloc_amount --期末差异结存 ,op.var_sub_class ,op.main_class_value ,op.org_id ,op.period_name ,op.job_ver_id from (select up.* ,q1.* from (SELECT DISTINCT maincl.* ,t.* FROM t inner join (SELECT fv.flex_value ,fv.description FROM fv inner join fs on fv.flex_value_set_id = fs.flex_value_set_id AND fs.flex_value_set_name = 'CUX_CST_VARIANCE_TYPE' AND fv.enabled_flag = 'Y' AND fv.hierarchy_level = '2' AND fv.flex_value LIKE '10%' ) maincl on t.var_main_class = maincl.flex_value inner join cur_dim_comb on cur_dim_comb.var_sub_class = t.var_sub_class and cur_dim_comb.acc_value = t.acc_value WHERE 1 = 1 AND t.top_var_type = '10' AND t.job_ver_id in (SELECT ver.job_ver_id AS p_job_ver_id FROM gerp.cux_cst_dist_jobs_all job INNER JOIN gerp.cux_cst_dist_jobs_vers_all ver ON job.job_id = ver.job_id) ORDER BY maincl.description ,t.acc_value ,cur_dim_comb.dim_comb ) up inner join (SELECT t1.* ,SUM(t1.begin_amount) begin_amount ,SUM(t1.accrual_amount) accrual_amount ,SUM(t1.balance_diff_alloc_amount) balance_diff_alloc_amount FROM gerp.cux_cst_data_alloc_his t1 LEFT JOIN gerp.cux_cst_data_alloc_his t ON t1.top_var_type = '10' AND t1.var_sub_class = t.var_sub_class --p_var_sub_class AND t1.org_id = t.org_id --p_org_id AND t1.period_name = t.period_name --p_period_name AND t1.job_ver_id = t.job_ver_id --p_job_ver_id AND t1.acc_value = t.acc_value --p_acc_value WHERE t1.dim_comb in (select distinct dim_comb from cur_dim_comb) group by t1.org_id,t1.period_name,t1.job_ver_id,t1.var_sub_class,t1.acc_value ) q1 on q1.org_id = up.org_id --p_org_id AND q1.period_name = up.period_name --p_period_name AND q1.job_ver_id = up.job_ver_id --p_job_ver_id AND q1.var_sub_class = up.var_sub_class --p_var_sub_class AND q1.acc_value = up.acc_value --p_acc_value ) op
05-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mycpen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值