" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper博主等级

千里之行,始于足下

  • 累计撰写 203 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录
Web

Python 操作MySQL数据库

PySuper
2019-10-28 / 0 评论 / 0 点赞 / 17 阅读 / 3340 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

连接数据库

直接连接操作

import pymysql


# 连接database
conn = pymysql.connect(
    host="你的数据库地址", 
    user="用户名",
    password="密码",
    database="数据库名",
    charset="utf8"
)

cursor = conn.cursor()    # 得到一个可以执行SQL语句的光标对象
sql = "insert into result_info (a, b) values(\"%s\", \"%s\")" %(A, B)    # 要执行的SQL语句
cursor.execute(sql)    # 执行SQL语句
cursor.close()    # 关闭光标对象
conn.close()    # 关闭数据库连接

插入数据失败回滚

import pymysql


conn = pymysql.connect(
    host="你的数据库地址", 
    user="用户名",
    password="密码",
    database="数据库名",
    charset="utf8"
)
cursor = conn.cursor()
sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
username = "Alex"
age = 18
try:
    cursor.execute(sql, [username, age])    # 执行SQL语句
    conn.commit()    # 提交事务
except Exception as e:
    conn.rollback()    # 有异常,回滚事务
cursor.close()
conn.close()

数据库事务四大属性

  • 原子性(Atomicity):包含的所有操作要么全部成功,要么全部失败回滚
  • 一致性(Consistency):必须使数据库从一个一致性状态变换到另一个一致性状态
  • 隔离性(Isolation):多个用户并发访问数据库时,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
  • 持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的

事务的隔离级别

  • Read uncommitted(读取未提交):其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值
  • Read committed(读取已提交):其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值
  • Repeatable read(可重复读):无论其他事务是否修改并提交数据,在这个事务中看到的数据值不受其他事务影响
  • Serializable(序列化):一个事务一个事务的执行

并发处理

悲观锁

当查询某条记录时,即让数据库为该记录加锁,锁住记录后别人无法操作,使用类似如下语法:

select stock from tb_sku where id=1 for update;

SKU.objects.select_for_update().get(id=1)

悲观锁类似于我们在多线程资源竞争时添加的互斥锁,容易出现死锁现象,采用不多。

乐观锁(OK!)

乐观锁并不是真实存在的锁,而是在更新的时候判断此时的库存是否是之前查询出的库存,如果相同,表示没人修改,可以更新库存,否则表示别人抢过资源,不再执行库存更新:

update tb_sku set stock=2 where id=1 and stock=7;

SKU.objects.filter(id=1, stock=7).update(stock=2)

任务队列

将下单的逻辑放到任务队列中(如celery),将并行转为串行,所有人排队下单。比如开启只有一个进程的Celery,一个订单一个订单的处理。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区