首页 > 数据库 >python连接mysql sql注入问题 事务

python连接mysql sql注入问题 事务

时间:2023-09-14 19:12:52浏览次数:39  
标签:事务 读取 python mysql 提交 sql 数据 name

1. pycharm连接MySQL 

import pymysql

# 1. 连接MySQL服务端
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123456',
    db='db3',
    charset='utf8',
    autocommit=True
)

# 2. 获取游标
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 3. 执行sql语句 # 进行sql的增删改查
sql = 'select * from emp;'
sql = "insert into emp (name, sex, age, dep_id, gender) values('aa', 'male', 10, 1, 0)"
# 4. 开始执行 affect_rows = cursor.execute(sql) # 影响的行数 print(affect_rows) conn.commit() # 增删改的时候需要二次提交、 查就不需要 # 5. 获得具体数据 for i in cursor.fetchall(): print(i) # print(cursor.fetchmany(3)) # 这个参数代表获取几条数据

 2. 视图

视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可
如果要频繁使用一张虚拟表,可以不用重复查询

如何创建视图
create view teacher2course as
select * from teacher inner join course on teacher.tid = course.teacher_id;
"""
创建好了之后 验证它的存在navicat验证 cmd终端验证
最后文件验证 得出下面的结论 视图只有表结构数据还是来源于之前的表
delete from teacher2course where id=1;
"""
1、在硬盘中,视图只有表结构文件,没有表数据文件

2、视图通常是用于查询,尽量不要修改视图中的数据

删除视图
drop view teacher2course;

3 .事务

1. 什么是事务?
开启一个事务可以包含一些sql语句,这些sql语句要么同时成功
要么一个都别想成功,称之为事务的原子性

事务的作用:
保证了对数据操作的'数据安全性'

案例:用交行的卡操作建行ATM机给工商的账户转钱

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

如何用事务?
# 先介绍事务的三个关键字 再去用表实际展示效果

start transaction;  # 开启事务
...    #  需要执行的操作

commit; # 二次确认提交 一但二次确认 就是永久性的
rollback; # 回滚  回到最初的状态 

sql展示“
create table user(
id int primary key auto_increment,
name char(32),
balance int
);

insert into user(name,balance)
values
('jason',1000),
('egon',1000),
('tank',1000);

# 修改数据之前先开启事务操作
start transaction;

# 修改操作
update user set balance=900 where name='jason'; #买支付100元
update user set balance=1010 where name='egon'; #中介拿走10元
update user set balance=1090 where name='tank'; #卖家拿到90元

# 回滚到上一个状态
rollback;

# 开启事务之后,只要没有执行commit操作,数据其实都没有真正刷新到硬盘
commit;
"""开启事务检测操作是否完整,不完整主动回滚到上一个状态,如果完整就应该执行commit操作"""

# 站在python代码的角度,应该实现的伪代码逻辑,
try:
    update user set balance=900 where name='jason'; #买支付100元
    update user set balance=1010 where name='egon'; #中介拿走10元
    update user set balance=1090 where name='tank'; #卖家拿到90元
except 异常:
    rollback;
else:
    commit;

# 那如何检测异常?
# 事务要尽量少的开
# 不要写一个SQL语句都写到事务里面去

4. 隔离级别

读未提交(Read Uncommitted):事务中的修改可以被其他事务读取,即一个事务可以读取到另一个未提交事务修改的数据。
简而言之:一个事务可以读到其他事务修改了但未提交的数据。

读已提交(Read Committed):事务只能读取已经提交的数据,不能读取未提交的数据。在该隔离级别下,事务只能读取到已经提交的数据,因此会避免脏读的情况。(脏读的概念可以参考本栏其他博客)
简而言之:数据的读取只能读取已经提交过的数据,和读未提交相比,读未提交可以读取修改了单位提交的数据。而读已提交则不行,因此避免了脏读的情况。

可重复读(Repeatable Read):在一个事务中多次读取同一个数据时,能够保证读取到的数据一致,即使其他事务修改了该数据。在隔离级别下,事务在读取数据时会锁定该数据,其他事务不能修改该数据,因此可以避免脏读和不可重复读的情况。
本人理解:应该用锁将写操作锁定,可以重复读取且数据保持一致。

串行化(Serializable,序列化):最高的隔离级别,它保证所有事务之间的执行顺序按照某个顺序执行,避免了所有并发问题。在该隔离级别下,事务之间互相等待,直到前一个事务执行完成后才能执行下一个事务,因此可以避免脏读、不可重复读和幻读的情况。
将事务串行化,一次只能按照特定顺序执行一个事务,因为只执行一个事务,会避免很多问题,但是肯定会降低执行效率。
  • 脏读 :一个事务读取到另一个事务还没有提交的数据

  • 不可重复读 :在一个事务中多次读取同一个数据时,结果出现不一致

  • 幻读 :在一个事务中,使用相同的 SQL 两次读取,第二次读取到其他事务新插入的行

 

 

标签:事务,读取,python,mysql,提交,sql,数据,name
From: https://www.cnblogs.com/lchengshao/p/17700653.html

相关文章

  • MySQL之Explain各列详解
    Explain各列详解explain语句执行后返回id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra列。1、id列id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按照select出现顺序增长的,MySQL将select查询分为简单查询(SIMPLE)和复杂查询(P......
  • 【转载】python 的sort()函数详解
    1.函数sort()是对列表就地排序>>>x=[8,9,0,7,4,5,1,2,3,6]>>>x.sort()>>>print(x)[0,1,2,3,4,5,6,7,8,9]2.函数sort()修改序列,不返回任何值>>>x=[8,9,0,7,4,5,1,2,3,6]>>>y=x.sort()>>>print(y)None>>>p......
  • mysql8安装卸载脚本
    说明:安装8.0.34版本mysql,脚本执行完成后会自动启动mysql,修改数据库root密码为Lz!2023@aD使用方法:./mysql_install.shinstall#安装数据库./mysql_install.shuninstall#卸载数据库安装包获取地址:链接:https://pan.baidu.com/s/1qpuFXaCTo1NQ44Hq_Vd_vg?pwd=9948#!/......
  • SQL注入和序列化的结合
    题目来自:[网鼎杯2018]Fakebook感觉原来学的有点局限,就只考虑到sql注入或者php反序列化啥的单方向,很少思考过结合起来的考法。话不多说,直接开解:登录要密码,join就是注册,估计直接注入注不出来,不然就不会给注册的选项了,那么我们就注册一个吧。这里注意一下blog的意思是给一个域......
  • Mysql存储引擎,你了解几个?
    引言MySQL是一种流行的关系型数据库管理系统(RDBMS),它支持多种不同的数据库引擎。数据库引擎是用于存储、管理和检索数据的核心组件,它们直接影响着数据库的性能、可靠性和功能,接下来本文介绍下一些常见的MySQL数据库引擎。存储引擎InnoDB引擎InnoDB是MySQL默认的事务性数据库引......
  • PostgreSQL-分区表介绍
    一、分区简介表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案。一般建议当单表大小超过内存就可以考虑表分区了。表的分区就是将一个逻辑上的大表(主要指数据量大),切分为多个小的物理的分片。1.分区的优点1)在某些情况......
  • python:英文间保留一个空格,中文间空格删除
    python代码:importredefremove_space_between_cn_en(text):strArray=re.split('',text)iflen(strArray)<2:returntextresult=''fortinstrArray:ift=='':continue......
  • Mysql 常用命令
    1.Mysql命令行登录mysql-h127.0.0.1-uroot-P3306-p2.创建用户CREATEUSER"killer"@"localhost"IDENTIFIEDBY"password";--允许远程登录的话,localhost改为%  3.用户授权GRANTALLPRIVILEGESON*.*TO"username"@"localho......
  • Mysql8.0升级到8.1
    1.官网下载8.1版本本次选择的zip的方式,也可选择MSI的方式(MSI文件下载后双击即可安装)   2.备份旧版中的数据库(使用Navicate工具做的备份)命令方式备份数据:mysqldump-uroot-proot-h127.0.0.1-P3306--all-databases>“F:\MySQL\MySQLServer8.0\data\backup.sql”3......
  • mybatis动态sql
    动态sql ......