数据库隔离级别
读未提交(Read Uncommitted)
- 定义: 是最低的一种事务级别,别人改数据的事务尚未提交,我在我的事务中也能读到。
- 缺点: 可能导致脏读,读到其他事务未提交的数据;
- 实例:
import records
from threading import Thread
import time
def func1():
with db.transaction() as tx:
tx.query("set session transaction isolation level read uncommitted")
data = tx.query("select * from keywords where id=1 ")
print(data.all())
time.sleep(1)
data = tx.query("select * from keywords where id=1 ")
print(data.all())
def func2():
with db.transaction() as tx:
tx.query("set session transaction isolation level read uncommitted")
tx.query("update keywords set keyword='1' where id=1 ")
tx.query("update keywords set keyword='2' where id=1 ")
tx.query("update keywords set keyword='3' where id=1 ")
if __name__ == '__main__':
db = records.Database("mysql+pymysql://user:password@localhost/weibo?charset=utf8")
t1 = Thread(target=func2)
t2 = Thread(target=func1)
t1.start()
t2.start()
结果:每次可能不一样
[<Record {"id": 1, "keyword": "1", "enable": 1}>]
[<Record {"id": 1, "keyword": "3", "enable": 1}>]
读已提交(Read committed)
- 定义: 别人改数据的事务已经提交,我在我的事务中也能读到。
- 缺点: 可能导致不可重复读,同一事物中,两次读取的数据可能不一样。
- 数据库 Oracle 默认隔离级别
可重复读(Repeatable Read)
- 定义: 别人改数据的事务已经提交,我在我的事务中也不去读。
- 缺点: 可能导致幻读 事务里没读到这条数据,但是库里已经存在
- 数据 mysql 默认隔离级别
并发版本控制(MCVV)的概念是什么, 是怎么实现的?
使用长事务的弊病? 为什么使用常事务可能拖垮整个库?
事务的启动方式有哪几种?
commit work and chain的语法是做什么用的?
怎么查询各个表中的长事务?
如何避免长事务的出现?