可序列化性

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

例如,假设事务 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 公司发送账单。