MySQL学习笔记03

一:事务(Transaction)

​ 事务是一个逻辑工作单元,这个逻辑工作单元包含的所有操作要么全部成功, 要么全部失败。

事务的特性(ACID):

​ 1. 原子性(Atomic) 事务中的所有操作不可再分,所有操作要么全部成功, 要么全部失败。

  1. 一致性(Consistency)事务操作之前是一种状态,操作之后是另一种状态,但数据库系统的一致性保持不变。

  2. 隔离性(Isolation)多个事务共同操作时,它们的操作过程是隔离的。即,一个事务在操作的过程中,其他事务不能看到其操作过程。

  3. 持久性(Durability)事务一旦提交,则对数据库系统的影响是持久性的,不能撤销(回滚)。

二:事务的隔离级别

1、前提概念:

​ 1. 脏读(dirty read) 一个事务读取到了其他事务操作过程中的数据,这种现象叫做“脏读”。 读取的该数据叫做“脏数据”。

  1. 不可重读(现象)在一个事务中两次读取的数据不一致的现象,叫做不可重读。

  2. 幻读两次读取的记录数量不一致的现象。

2、隔离级别:

  1. 读未提交隔离级别(read uncommitted)可以读取其他事务未提交的数据,可能发生脏读、不可重读、幻读。

  2. 读提交级别(read committed)只能读取到其他事务已经提交的数据,可能发生不可重读、幻读。

  3. 可重读级别(repeatable read)-------MySQL默认的隔离级别在一个事务中多次读取的数据值是相同的。注意:在MySQL的InnoDB存储引擎已经解决了幻读现象。

  4. 序列化(串行化)隔离级别(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)

​ 索引中存储的是索引字段的值与其对应的逻辑指针(记录所在的位置)。 索引可以显著地提高查询效率。 注意事项:应该在大表(数据量大)、使用频繁的列上创建索引; 索引本身也要占用空间,索引并不是越多越好。

索引的类型:

  1. 普通索引 (index)

    创建普通索引:create index 索引名称 on 表名称(字段列表);

  2. 唯一索引 (unique index)

    创建唯一索引:create unique index 索引名称 on 表名称(字段列表);

  3. 主键索引 (primary key)

  4. 全文索引 (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()

猜你喜欢

转载自blog.csdn.net/weixin_42569562/article/details/82827692
今日推荐