数据库事务隔离(以mysql为例)

431 阅读1分钟

数据库隔离级别

读未提交(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的语法是做什么用的?

怎么查询各个表中的长事务?

如何避免长事务的出现?