连接数据库
直接连接操作
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,一个订单一个订单的处理。
评论区