视图函数(Controller)
视图函数(Controller)
如何设计视图函数
1.用户的每个操作(用户故事)对应一个视图函数。
数据的完整性:
-
实体完整性 - 没有冗余数据 - 主键/唯一索引
-
参照完整性 - 外键
-
域完整性 - 数据类型 / 长度 / 非空约束 / 默认值约束 / 检查约束
2.每个视图函数可以构成一个事务边界。 -
事务的ACID特性。
- 原子性(Atomicity):事务中各项的操作要么全做要么全不做;
- 一致性(Consistentcy):事务前后系统的状态是一致的;
- 隔离性(Isolation):并发执行的事务无法看到彼此的中间状态;
- 持久性(Duration):事务完成后所做的改动都会被持久化。
-
事务隔离级别-设置事务隔离级别是为了数据库底层依据事务隔离级别为数据加上适当的锁。如果需要保证数据的强一致性,那么关系型数据库仍然是唯一的也是最好的选择,因为关系型数据库可以通过锁机制来保护数据。事务隔离级别从低到高依次是:Read Uncommitted(读未提交)、Read Commited(读提交)、Repeatable Read(可重复读)、Searializable(串行化)。事务隔离级别越高,数据并发访问的问题越少,但是性能越差;事务隔离级别越低,数据并发访问的问题越多,但是性能越好。
-
数据库并发访问会产生的5种问题:
-
第1类丢失更新(A事务撤销覆盖B事务更新的数据)和第2类丢失更新(A事务提交覆盖B事务更新的数据)。
-
脏读(读脏数据):一个事务读取到其他尚未提交的事务的数据;
-
不可重复读:一个事务在读取它的查询结果时,被另一个事务更新了他的查询记录导致无法读到数据。
-
幻读:一个事务在读取它的查询结果时,发现读到了被另一个事务提交的新数据。
set global transaction isolation level repeatable read;
#设置全局默认的事务隔离级别
set session transaction isolation level committed
#设置当前会话的事务隔离级别
select @@tx_isolation
#查询当前会话的事务隔离级别 -
Django中的事务控制。
- 给每个请求绑定事务环境(反模式)。
ATOMIC_REQUESTS = True
- 使用事务装饰器(简单易用)-粗粒度(控制不够精细)。
@transaction.non_atomic_requests @transaction.atomic
- 使用上下文语法(细粒度-事务控制的范围更加精确)。
- 给每个请求绑定事务环境(反模式)。
with transaction.atomic()
pass
- 关闭自动提交使用手动提交。
AUTOCOMMIT = False
transaction.commit()
transaction.rollback()
事务 - 锁进制 - InnoDB - 表级锁/行级锁 - 共享锁、排他锁
我们通过设置事务隔离级别让数据库自动选择合适的锁来保护数据
Authentication / Authorization
两种方式:RBAC(基于角色的访问控制) / ACL(访问控制列表)