38、mysql数据库(pymysql及事务)
38.1、python之pymysql模块:
1、说明:
pymsql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同。
2、模块安装:
pip install pymysql
3、在pycharm中添加pymysql模块:
File——>settings——>Project:python——>Project Interpreter——>点击"+"——>输入pymysql——>Install Package
4、执行sql语句:
import pymysql
#导入pymysql模块
conn =pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="lc2", charset="utf8")
#连接数据库
cursor = conn.cursor()
#得到数据库游标对象
#创建表
# create_table_employee = """CREATE TABLE EMPLOYEE(
# id INT primary key AUTO_INCREMENT,
# FIRST_NAME CHAR(20) NOT NULL unique,
# LAST_NAME CHAR(20),
# AGE INT,
# SEX CHAR(1),
# INCOME FLOAT)"""
# create_table_employee_result=cursor.execute(create_table_employee)
# print(create_table_employee_result)
# 创建表成功后返回0,创建失败报错
#插入数据
# insert_sql="INSERT INTO employee(id,first_name,last_name,age,sex,income)" \
# "values(1,'汤姆猫','tom',2,'男',1995),(2,'杰瑞鼠','jierui','2','男',1995)"
# insert_sql_result=cursor.execute(insert_sql)
# print(insert_sql_result)
# 插入成功后返回插入记录的条数,插入失败报错
# print(cursor.lastrowid)
#在插入语句后查看获取插入的最后一条数据的自增ID
# 更新数据
# update_sql="update employee set sex='女' where LAST_NAME='jierui'"
# update_sql_result=cursor.execute(update_sql)
# print(update_sql_result)
# 更新成功后返回插入记录的条数,更新失败报错,没有更新记录返回0
# 查询数据
query_sql = "select * from employee"
query_sql_result=cursor.execute(query_sql)
# print(query_sql_result)
# 查询成功后返回记录的条数,等价于select count(*) from employee,查询失败报错
query_sql_one = cursor.fetchone()
print(query_sql_one)
# 获取一条记录(row),返回单层元组,如果没有结果则返回None
# (1, '汤姆猫', 'tom', 2, '男', 1995.0)
# query_sql_many=cursor.fetchmany(1)
# print(query_sql_many)
# 获取指定条记录(row),返回双层元组,如果没有结果则返回()
# ((1, '汤姆猫', 'tom', 2, '男', 1995.0),)
# query_sql_all=cursor.fetchall()
# print(query_sql_all)
# 返回多条记录(rows),返回双层元组,如果没有结果则返回()
# ((1, '汤姆猫', 'tom', 2, '男', 1995.0), (2, '杰瑞鼠', 'jierui', 2, '女', 1995.0))
# 更改数据库游标对象的位置
# cursor.scroll(-1,mode='relative')
# 相对当前位置移动
# cursor.scroll(2,mode='absolute')
# 相对绝对位置移动
conn.commit()
#提交事物
cursor.close()
#关闭mysql游标对象
conn.close()
#关闭和mysql的连接
38.2、事物:
1、事物命令:
(1)事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
(2)数据库开启事务命令:
1)说明:
数据库事务起始于SQL语句,终止于以下4种事件之一,事务结束后,下一条SQL语句将开始一
个新的事务。
A、COMMIT或ROLLBACK语句。
B、DDL(创建/删除视图、触发器、存储过程、自定义函数、索引,修改表结构)/DCL(用户赋权或减权)隐式提交。
C、用户退出时自动提交。
D、系统强行关闭时取消事务。
2)start transaction:开启事务。
PS:
设置不自动提交(commit)也是开启了事务,mysql默认是自动提交事务,oracle默认是不自动提交事务。
pymysql模块自动开启了不自动提交。
在不同的连接(session)下,使用'commit;'是相互不影响的。
3)Rollback:回滚事务,即撤销指定的sql语句(只能回退insert delete update语句),回滚
到上一次commit的位置。
4)Commit:提交事务,提交未存储的事务。
5)savepoint:保留点,事务处理中设置的临时占位符,你可以对它发布回退(与整个事务回
退不同),回退到更早的点就不能回退到最近的点了。
savepoint delete1;
--创建保留点
rollback to delete1;
--还原保留
commit;
--提交事务
(3)转账实例:
UPDATE account set balance=balance-5000 WHERE name="lc1";
UPDATE account set balance=balance+5000 WHERE name="lc2";
(4)python中调用数据库启动事物的方式:
1)创建试验表和所需要的数据:
--创建表
CREATE TABLE ACCOUNT(
id INT primary key AUTO_INCREMENT,
NAME CHAR(20) NOT NULL unique,
salary FLOAT);
--插入数据
INSERT INTO ACCOUNT(id,name,salary) values(1,'tom',1000),(2,'jack',2000);
--查询数据
select * from account;
2)代码:
import pymysql
try:
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="lc2", charset="utf8")
cursor = conn.cursor()
insertSQL0 = "INSERT INTO ACCOUNT (name,salary) VALUES ('lc',3000)"
insertSQL1 = "UPDATE account set salary=salary-30 WHERE name='tom'"
insertSQL2 = "UPDATE account set salary=salary+30 WHERE name='jack'"
cursor.execute(insertSQL0)
conn.commit()
# insertSQL0是一个事务,事务完成就提交。
cursor.execute(insertSQL1)
raise Exception
# insertSQL1抛出异常,下面的内容都不再执行。
cursor.execute(insertSQL2)
conn.commit()
# insertSQL1和insertSQL2加起来是一个事务。
except Exception as e:
conn.rollback()
# 出现异常后回滚数据到上次commit的位置,又进入到一个新的事务。
conn.commit()
# 再次提交数据
cursor.close()
# 关闭数据库游标
conn.close()
# 关闭数据库连接
2、事物特性:
(1)原子性(Atomicity):
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
(2)一致性(Consistency):
事务前后数据的完整性必须保持一致,在事务执行之前数据库是符合数据完整性约束的,
无论事务是否执行成功,事务结束后的数据库中的数据也应该是符合完整性约束的。在
某一时间点,如果数据库中的所有记录都能保证满足当前数据库中的所有约束,则可以
说当前的数据库是符合数据完整性约束的。比如删部门表前应该删掉关联员工(已经建
立外键),如果数据库服务器发生错误,有一个员工没删掉,那么此时员工的部门表已
经删除,那么就不符合完整性约束了,所以这样的数据库也就性能太差啦。
(3)隔离性(Isolation):
1)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务
所干扰,多个并发事务之间数据要相互隔离。
2)将数据库设计为串行化程的数据库,让一张表在同一时间内只能有一个线程来操作,如
果将数据库设计为这样,那数据库的效率太低了,所以数据库的设计者没有直接将数据库设
计为串行化,而是为数据库提供多个隔离级别选项,使数据库的使用者可以根据使用情况自
己定义到底需要什么样的隔离级别。
3)mysql隔离级别和事物并发对应的关系:
A、脏读:一个事务读取到了另一个事务未提交的数据,这样做特别的危险,要尽力防止。
B、不可重复读:在一个事物内读取表中的某一行数据,多次读取结果不同(一个事物读
取到了另一个事务已经提交的数据—增加记录、删除记录、修改记录),在某些情况下并
不是问题,在另一些情况下就是问题。
C、幻读:指在一个事务内读取到了别的事务插入的数据,导致前后不一致(一个事务读
取到了另一个事务已经提交的数据—增加记录、删除记录、修改记录),在某些情况下并
不是问题,在另一些情况下就是问题。
4)数据库的安全性和效率:
安全性考虑:Serializable>Repeatable read>Read committed>Read uncommitted
数据库效率:Read uncommitted>Read committed>Repeatable read>Serializable
一般情况下,我们会使用Repeatable read、Read committed,mysql数据库默认的数
据库隔离级别Repeatable read,oracle数据库默认的数据隔离级别是Read committed。
5)mysql中设置数据库的隔离级别语句:
set global/session transaction isolation level xxxx;
如果使用global,则修改的是数据库的默认隔离级别,所有新开的窗口的隔离级别继承自这
个默认隔离级别。如果使用session修改,则修改的是当前客户端的隔离级别,和数据库默
认隔离级别无关,当前的客户端是什么隔离级别,就能防止什么隔离级别问题,和其他客户
端是什么隔离级别无关。
6)查看mysql中设置数据库的隔离级别语句:
show global variables like '%tx_isolation%';
select @@tx_isolation;
--@@代表的是全局变量
(4)持久性(Durability):
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使
数据库发生故障也不应该对其有任何影响。
38、mysql数据库(pymysql及事务)的更多相关文章
- MySQL数据库引擎、事务隔离级别、锁
MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能 ...
- 第二百七十九节,MySQL数据库-pymysql模块操作数据库
MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...
- MYSQL数据库重点:事务与锁机制
一.事务 一组连续的数据库操作,每一次操作都成功,整个事务就成功,只要有一步出错,整个事务就失败: MySQL事务与存储引擎相关 1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB: ...
- Django2.2使用mysql数据库pymysql版本不匹配问题的解决过程与总结
前置条件 django版本:2.2.1 python版本:3.6.6 mysql版本:mysql-community8.0.15 问题 在搭建django项目,配置mysql数据库时遇到无法迁移数据库 ...
- MySQL数据库 InnoDB引擎 事务及行锁总结
一.事务 1.事务的四大特性 (1)原子性:事务开始后所有的操作要么一起成功,要么一起失败,整个事务是一个不可分割的整体. (2)一致性:是物开始前到结束后,数据库的完整性约束没有被破坏. (3)隔离 ...
- mysql数据库----Pymysql
本节重点: pymysql下载和使用 sql注入 增.删.改:conn.commit() 查:fetchone.fetchmany.fetchall 一.pymysql的下载和使用 之前我们都是通过M ...
- MySQL数据库-pymysql模块操作数据库
pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connect() 参数: host=数据库ip port= ...
- Python连接MySQL数据库(pymysql的使用)
本文Python版本3.5.3,mysq版本5.7.23 基本使用 # 导入pymysql模块 import pymysql #连接数据库 conn = pymysql.connect( databa ...
- 使用python连接mysql数据库——pymysql模块的使用
安装pymysql pip install pymysql 使用pymysql 使用数据查询语句 查询一条数据fetchone() from pymysql import * conn = conne ...
- MYSQL数据库索引、事务。
=============================================================================================== inno ...
随机推荐
- [bug] Hive启动报错:hive Name node is in safe mode.
关闭HDFS安全模式 hadoop dfsadmin -safemode leave
- 进入除错模式!进入此模式后,将会出现更多的选项,分别是: · 以基本图形介面安装 CentOS 7 (使用标准显卡来设定安装流程图示); · 救援Centos系统; · 执行内存测试(Run a memory test);
Centos 7.3 安装 0.0392017.07.14 20:12:09字数 1550阅读 985 Centos 7.3 基于 Red Hat 企业版的源代码的最新版本的 CentOS 7 在今年 ...
- Linux进阶之bond链路聚合
一.简述: 一般来讲,生产环境必须提供7×24小时的网络传输服务.借助于网卡绑定技术,不仅可以提高网络传输速度,更重要的是,还可以确保在其中一块网卡出现故障时,依然可以正常提供网络服务.假设我们对两块 ...
- KEIL-C下数组指针与指针数组实验
http://blog.csdn.net/men_wen/article/details/52694069 第一个: 数组指针的小实验 用指针传递参数 结果: 第二个: 数组指针实验 定义一个指针 ...
- RIP OSPF 等路由协议属于计算机网络分层中的哪一层
RIP基于UDP,BGP基于TCP,OSPF EGP基于IP 在TCP/IP协议栈中定义的路由协议用于发现和维护前往目的地的最短路径.可以认为它们不属于网络层协议(注意,是用based on,而不是实 ...
- 离散傅里叶变换的衍生,负频率、fftshift、实信号、共轭对称
封面是福州的福道,从高处往下看福道上的人在转圈圈.从傅里叶变换后的频域角度来看,我们的生活也是一直在转圈圈,转圈圈也是好事,说明生活有规律,而我们应该思考的是,如何更有效率地转圈圈--哦别误会,我真不 ...
- System Verilog MCDF(二)
整形器的接口时序: reg,grant是维持了两个clk的. chid ,length在发送数据期间不可以变化. 第一个data数据必须在start上升沿的同一个clk发送. reg,grant两者之 ...
- curl测试代理连接某个域名的连接时间
缘由:需要查询一下某些代理访问指定域名所消耗的时间,来判断是否是代理连接受限 以下代理均为示例代理,无法真正连接 1. 通过curl方式来测试指定代理的连接情况,代理无账号密码 curl -x 127 ...
- 浅析IOC 和 DI
学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 十一、.net core(.NET 6)搭建ElasticSearch(ES)系列之ElasticSearch、head-master、Kibana环境搭建
搭建ElasticSearch+Kibana环境 前提条件:已经配置好JDK环境以及Nodejs环境.如果还未配置,请查看我的上一篇博客内容,有详细配置教程. 先下载ElasticSearch(以下文 ...