知识点一:mysql事务
知识点二:python链接mysql
知识点三:python链接redis
知识点一:mysql事务
关系型数据库的ACID(原子性、一致性、隔离性与持久性)
#一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
#1 原子性
原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。可采用“A向B转账”这个例子来说明解释在DBMS中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。
#2 一致性
一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
对银行转账事务,不管事务成功还是失败,应该保证事务结束后ACCOUNT(账户)表中a和b的存款总额为2000
#隔离性
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
简单说: 隔离性追求的是并发情形下事务之间互不干扰。
事务隔离分为不同级别,包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
#未提交读: 在读数据时不会检查或使用任何锁。因此,在这种隔离级别中可能读取到没有提交的数据。
#已提交读:只读取提交的数据并等待其他事务释放排他锁。读数据的共享锁在读操作完成后立即释放。已提交读是SQL Server的默认隔离级别
#可重复读: 像已提交读级别那样读数据,但会保持共享锁直到事务结束,
#可串行读:工作方式类似于可重复读。但它不仅会锁定受影响的数据,还会锁定这个范围。这就阻止了新数据插入查询所涉及的范围。
#持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
演示
begin; #开启事物
select *from new_tb_name;
insert into new_tb_name values(3,'he11o',18);
commit; #提交成功
begin;
insert into new_tb_name values(5,'jack',11);
insert into new_tb_name values(6,'jack',110);
rollback; #撤销全部
select *from new_tb_name;
知识点二:python链接mysql
#pip install pymysql
import pymysql
# 连接
db_config={
"host": "127.0.0.1",
"port": 3306,
"user": "jianqi",
"password": "wmf20030102",
"db":"test",
}
# 获取链接对象
conn = pymysql.connect(**db_config)
# 创建游标
cur = conn.cursor()
try:
sql = "insert into Student values ('37','fufu','男',21,'jk')"
cur.execute(sql)
except Exception as e:
print(e)
conn.rollback()
else:
conn.commit()
finally:
cur.close()
conn.close()
知识点二:python链接redis
#pip install redis
import redis
red=redis.StrictRedis(host="127.0.0.1",decode_responses=True)
#string
# red.set("name","捡起")
# ret = red.get("name")
red.append("name"," fufu")
print(red.get("name"))
red.delete("name")
print(red.get("name"))
print(red.exists("name"))
red.mset({"abc":123,"bcd":456})
print(red.mget("abc","bcd"))
red.rename("name","new_name")
print(red.keys())
#list
red.lpush("list_name","g1","g2")
red.lrem("list_name",0,"g2")
print(red.lrange("list_name",0,-1))
print(red.llen("list_name"))
#hash
red.hset("hash_name","name","jianqi")
print(red.hget("hash_name","name"))
red.hmset("hash_name",{"name1":"fufu","name2":"jianqi"})
print(red.hmget("hash_name","name","name1","name2"))
print(red.hgetall("hash_name"))
#set
red.sadd("set_name",1,2,3,1,2)
red.srem("set_name",3)
print(red.smembers("set_name"))
print(red.scard("set_name"))#2
#zset
red.zadd("zzet_name",{'g6':10.2})
print(red.zrange('zzet_name',0,-1))
print(red.zscore('zzet_name','g6'))
print(red.zcard("zzet_name"))
440

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



