一:事务(Transaction)
事务是一个逻辑工作单元,这个逻辑工作单元包含的所有操作要么全部成功, 要么全部失败。
事务的特性(ACID):
1. 原子性(Atomic) 事务中的所有操作不可再分,所有操作要么全部成功, 要么全部失败。
一致性(Consistency)事务操作之前是一种状态,操作之后是另一种状态,但数据库系统的一致性保持不变。
隔离性(Isolation)多个事务共同操作时,它们的操作过程是隔离的。即,一个事务在操作的过程中,其他事务不能看到其操作过程。
持久性(Durability)事务一旦提交,则对数据库系统的影响是持久性的,不能撤销(回滚)。
二:事务的隔离级别
1、前提概念:
1. 脏读(dirty read) 一个事务读取到了其他事务操作过程中的数据,这种现象叫做“脏读”。 读取的该数据叫做“脏数据”。
不可重读(现象)在一个事务中两次读取的数据不一致的现象,叫做不可重读。
幻读两次读取的记录数量不一致的现象。
2、隔离级别:
读未提交隔离级别(read uncommitted)可以读取其他事务未提交的数据,可能发生脏读、不可重读、幻读。
读提交级别(read committed)只能读取到其他事务已经提交的数据,可能发生不可重读、幻读。
可重读级别(repeatable read)-------MySQL默认的隔离级别在一个事务中多次读取的数据值是相同的。注意:在MySQL的InnoDB存储引擎已经解决了幻读现象。
序列化(串行化)隔离级别(Serializable)事务在序列化隔离级别下,普通的select语句也会加“读锁”。注意:在串行化隔离级别下,一个普通的select查询操作也会加上"读锁"。
三:数据库锁
根据锁的共享性将数据库锁划分为“读锁”(共享锁)、“写锁”(排他锁)。 “读锁”与“读锁”可兼容(共享),但是与“写锁”排斥; “写锁”与“读锁”和其他“写锁”都排斥。
一般情况下,操作数据库时不必手工加锁,因为DBMS在合适的情况下会自动帮助我们加锁。修改(update)、删除(delete)操作会自动加上“写锁”。
如果需要进行研究,手工加锁的方式:1.添加“读锁”的方式: select 字段名... from 表名称 [where 条件] lock in share mode;
2.添加"写锁"的方式: select 字段名... from 表名称 [where 条件] for update;
四:事务操作命令
1.开启事务
begin | start transaction
2.提交事务
commit
3.设置保存点
savepoint 保存点名称
4.回滚整个事务
rollback
5.回滚到指定保存点状态
rollback to 保存点名称
6.查看当前事务的隔离级别
select @@tx_isolation;
7.设置当前会话(连接)的事务隔离级别
set session transaction isolation level read uncommitted | read committed | repeatable read | serializable
五:索引(index)
索引中存储的是索引字段的值与其对应的逻辑指针(记录所在的位置)。 索引可以显著地提高查询效率。 注意事项:应该在大表(数据量大)、使用频繁的列上创建索引; 索引本身也要占用空间,索引并不是越多越好。
索引的类型:
普通索引 (index)
创建普通索引:create index 索引名称 on 表名称(字段列表);
唯一索引 (unique index)
创建唯一索引:create unique index 索引名称 on 表名称(字段列表);
主键索引 (primary key)
全文索引 (fulltext)
查看索引:
show index from 表名称;
删除索引:
drop index 索引名称 on 表名称;
六:视图(view)
可以把视图看作是一张虚拟表,用来封装查询语句。 create [or replace] view 视图名称 as select 语句;
例如: create or replace view dept_view as select d_no as 部门编号,d_name as 部门名称 from dept;
七:配置MySQL远程访问权限
1.修改配置文件:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 注释掉: bind 127.0.0.1这一句
2.进入Mysql,授予root用户远程登录的权限
grant all privileges on . to 'root'@'%' identified by '123456' with grant option;
3.进入Mysql,刷新权限
flush privileges;
4.退出mysql环境,重启mysql服务
sudo systemctl restart mysql
八、python连接数据库
1、安装连接驱动
pip install pymysql
2、python对数据库的增删改查
(1)
import pymysql # 获取数据库连接对象 conn = pymysql.Connect( host='localhost', port=3306, user='root', password='123456', database='mydb', charset='utf8', ) cursor = conn.cursor() # 获取游标操作对象 sql = "insert into stu(name,age,sex,score)values('%s',%d,'%s',%.2f)" try: cursor.execute(sql%('霍去病',22,'男',83.123)) # 执行SQL conn.commit() # 提交 print("插入成功!") except Exception as e: print("发生异常啦~~~,异常对象信息是:",e) conn.rollback() # 回滚 finally: cursor.close() conn.close()
(2) import pymysql # 获取数据库连接对象 conn = pymysql.Connect( host='10.12.153.39', port=3306, user='root', password='123456', database='mydb', charset='utf8', ) cursor = conn.cursor() # 获取游标操作对象 sql = "select d_no,d_name,d_location from dept where d_no=%d" try: cursor.execute(sql % (20,)) # 执行SQL result = cursor.fetchone() # 获取单条数据 print("部门编号:",result[0],"; 部门名称:",result[1],";部门地址:",result[2]) except Exception as e: print("查询出现异常啦~~~",e) finally: cursor.close() conn.close()
(3) import pymysql # 获取数据库连接对象 conn = pymysql.Connect( host='10.12.153.39', port=3306, user='root', password='123456', database='mydb', charset='utf8', ) cursor = conn.cursor() # 获取游标操作对象 sql = "select d_no,d_name,d_location from dept where d_no=%d" try: cursor.execute(sql % (20,)) # 执行SQL result = cursor.fetchone() # 获取单条数据 print("部门编号:",result[0],"; 部门名称:",result[1],";部门地址:",result[2]) except Exception as e: print("查询出现异常啦~~~",e) finally: cursor.close() conn.close()