可序列化性

理想情况下,事务应可序列化。 如果同时运行事务的结果与有序运行事务(即一个接一个)的结果相同,则事务是可序列化的。 首先执行的事务并不重要,重要的是结果不反映事务的任何混合。

例如,假设事务 A 将数据值乘以 2,事务 B 将数据值加 1。 现在假设有两个数据值:0 和 10。 如果这些事务相继运行,则如果事务 A 首先运行,则新值将为 1 和 21;如果事务 B 首先运行,则为 2 和 22。 但是,如果每个值运行这两个事务的顺序不同,该怎么办? 如果事务 A 在第一个值上运行,并且事务 B 在第二个值上运行,则新值为 1 和 22。 如果反转此顺序,则新值为 2 和 21。 如果 1、21 和 2、22 是唯一可能的结果,则事务可序列化。 如果 1、22 和 2、21 是唯一可能的结果,则事务不可序列化。

那么,为什么可序列化性是可取的? 换句话说,在一个事务完成之后下一个事务方可开始,为什么这一点很重要? 考虑以下问题。 销售人员在职员发送账单的同时输入订单。 假设销售人员从 X 公司输入订单,但不提交订单;销售人员仍在与 X 公司的代表交谈;某职员请求获取所有未履行订单的列表,发现公司 X 的订单,并向他们发送了账单。 现在,X 公司的代表决定要更改订单,因此销售人员在提交交易之前对其进行更改。 X 公司收到不正确的帐单。

如果销售人员和职员的交易可序列化,则此问题永远不会发生。 销售人员的交易将在职员的事务开始之前完成,在这种情况下,职员会发送正确的账单,或者职员的事务将在销售人员的交易开始之前完成,在这种情况下,职员根本不会向 X 公司发送账单。