事务(transaction)概念
一组DML语句(select、update、delete等)在同一事务中,要么全都提交,要么全不提交
事务隔离性
读未提交(read uncommitted)
- 事物A和事物B,事物A未提交的数据,事物B可以读取到
- 这里读取到的数据叫做“脏数据”
- 这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别
读已提交(read committed)
- 事物A和事物B,事物A提交的数据,事物B才能读取到
- 这种隔离级别高于读未提交
- 换句话说,对方事物提交之后的数据,我当前事物才能读取到
- 这种级别可以避免“脏数据”
- 这种隔离级别会导致“不可重复读取”
- Oracle默认隔离级别
可重复读(repeatable read)
- 事务A和事务B,事务A提交之后的数据,事务B读取不到
- 事务B是可重复读取数据
- 这种隔离级别高于读已提交
- 换句话说,对方提交之后的数据,我还是读取不到
- 这种隔离级别可以避免“不可重复读取”,达到可重复读取
- 比如1点和2点读到数据是同一个
- MySQL默认级别
- 虽然可以达到可重复读取,但是会导致“幻像读”
串行化(serializable)
- 事务A和事务B,事务A在操作数据库时,事务B只能排队等待
- 这种隔离级别很少使用,吞吐量太低,用户体验差
- 这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发
悲观锁与乐观锁
悲观锁
在一个事务结束之前,别的事物无法对该数据进行修改(影响并发性能)
乐观锁
允许多个事务同时修改,一旦其中一个事务进行了提交,则其他事务无法进行提交
Django中应用
model.objects.select_for_update().get() #加互斥锁
# view函数前加transaction修饰符保证原子性
@transaction.atomic
网友评论