知识卡片
会话状态的边界:ACID反直觉结果,与临时缓存的区分
内容
购物车这类会话状态只属于特定会话、与其他会话及其业务事务分离,直到提交才会变成数据库里的持久记录数据——正因为会话状态本质上活在一个尚未提交的业务事务里,它天然带有ACID的部分性质,但这会带来一些不那么直观的结果。对一致性的影响:客户编辑保险单时,输入了一个非法值、系统提示无效,但这个非法值此刻仍然是会话状态的一部分——会话状态常常包含这类”暂时无效”的信息,因为校验通常只在业务事务真正提交那一刻才严格执行,不会时时刻刻检查。对隔离性的影响:不仅”两人同时编辑同一份保单”会出问题,更隐蔽的情形是——保单记录里的风险值和客户信息记录里的邮编相关,客户开始编辑保单十分钟后才去查邮编,这十分钟内如果别人恰好改了邮编或风险值,客户看到的就是一次不一致读(对应5.5.4节讨论过的业务事务隔离性难题)。另外需要明确区分的是:并非会话里的所有数据都算”会话状态”——会话完全可以临时缓存一些其实不需要跨请求保存的数据,纯粹为了提升响应性能;这类缓存数据一旦丢失并不影响程序的正确性,这正是它和真正会话状态的分界线——会话状态是”丢了就出错”的那部分,缓存数据是”丢了大不了重新算一次”的那部分。
参考来源
- 位置:《企业应用架构模式》第一部分"表述"之"第6章 会话状态"之"6.2 会话状态"(源文件:_epub-src/OEBPS/Text/000043.html)
- 结论依据:原文说明"会话状态经常包含这样的无效信息——在处理这些信息时并没有时时检查它们,而只在业务事务提交时才检查它们……会话状态最大的问题出现在处理隔离性的时候……某客户开始编辑保险单,10分钟后又打开了客户信息记录查询邮政编码。然而,在此期间可能有其他用户修改了邮政编码和风险值——导致不一致读……由于丢失这些缓存的数据也不会影响程序的正确性,这样的数据有别于会话状态",直接支撑本卡结论。
- 原始内容:不能把会话中的所有数据都看成会话状态。会话可以临时缓存实际上并不需要在各次请求间保存的数据,以便提高服务性能。由于丢失这些缓存的数据也不会影响程序的正确性,这样的数据有别于会话状态。