def doreadconflict(self, db, mvcc): tm1 = transaction.TransactionManager() conn = db.open(mvcc=mvcc, transaction_manager=tm1) r1 = conn.root() obj = MinPO('root') r1["p"] = obj obj = r1["p"] obj.child1 = MinPO('child1') tm1.get().commit() # start a new transaction with a new connection tm2 = transaction.TransactionManager() cn2 = db.open(mvcc=mvcc, transaction_manager=tm2) r2 = cn2.root() self.assertEqual(r1._p_serial, r2._p_serial) obj.child2 = MinPO('child2') tm1.get().commit() # resume the transaction using cn2 obj = r2["p"] # An attempt to access obj.child1 should fail with an RCE # below if conn isn't using mvcc, because r2 was read earlier # in the transaction and obj was modified by the other # transaction. obj.child1 return obj