public override void Set(IStmMemory memoryRef, object value, int[] memoryVersion = null) { IInnerTransactionStmMemory innerMemoryRef = (IInnerTransactionStmMemory)memoryRef; MemoryTuple memoryTuple = GenerateMemoryTuple(innerMemoryRef, memoryVersion, value); FixMemoryChange(innerMemoryRef, memoryTuple); if (!memoryRefsToUpdate.Contains(innerMemoryRef)) { memoryRefsToUpdate.Add(innerMemoryRef); } }
public override object Get(IStmMemory memoryRef, int[] memoryVersion = null) { IInnerTransactionStmMemory innerMemoryRef = (IInnerTransactionStmMemory)memoryRef; MemoryTuple memoryTuple = GenerateMemoryTuple(innerMemoryRef, memoryVersion); if (!memoryChanges.ContainsKey(innerMemoryRef)) { FixMemoryChange(innerMemoryRef, memoryTuple); } return(memoryTuple.value); }
private void FixMemoryChange(IInnerTransactionStmMemory memoryRef, MemoryTuple memoryTyple) { if (memoryChanges.ContainsKey(memoryRef)) { memoryChanges[memoryRef] = memoryTyple.value; } else { memoryChanges.Add(memoryRef, memoryTyple.value); FixMemoryVersion(memoryRef, memoryTyple); } }
public void SetMemoryVersionsToCurrent() { int countMemoryRefVersioned = memoryStartVersions.Count; IInnerTransactionStmMemory[] memoryRefs = new IInnerTransactionStmMemory[countMemoryRefVersioned]; memoryStartVersions.Keys.CopyTo(memoryRefs, 0); for (int i = 0; i < countMemoryRefVersioned; i++) { IInnerTransactionStmMemory memoryRef = memoryRefs[i]; memoryStartVersions[memoryRef] = memoryRef.GetVersionForImbrication(imbrication); } state = I_TRANSACTION_STATE.ROLLBACKED_BY_SUBTRANSACTION; }
public void FixMemoryVersion(IInnerTransactionStmMemory memoryRef, MemoryTuple memoryTuple) { lock (subTransactionsLocker) { if (!memoryStartVersions.ContainsKey(memoryRef)) { memoryStartVersions.Add(memoryRef, memoryTuple.version[imbrication]); if (parentTransaction != null) { ParentTransaction.FixMemoryVersion(memoryRef, memoryTuple); } } } }
private MemoryTuple GenerateMemoryTuple(IInnerTransactionStmMemory memoryRef, int[] memoryVersion, object memoryValue = null) { int[] currentMemVersion = null; if (memoryVersion == null) { currentMemVersion = memoryRef.Version; } if (memoryValue == null) { return(MemoryTuple.Get(GetTransactionMemoryValue(memoryRef), currentMemVersion)); } else { return(MemoryTuple.Get(memoryValue, currentMemVersion)); } }
public object GetTransactionMemoryValue(IInnerTransactionStmMemory memoryRef) { if (memoryChanges.ContainsKey(memoryRef)) { return(memoryChanges[memoryRef]); } else { if (parentTransaction != null) { return(ParentTransaction.GetTransactionMemoryValue(memoryRef)); } else { return(memoryRef.GetValue()); } } }
public bool ValidateMemoryVersion(IInnerTransactionStmMemory memoryRef)//ok { if (parentTransaction != null) { if (!ParentTransaction.ValidateMemoryVersion(memoryRef)) { state = I_TRANSACTION_STATE.PARENT_CONFLICT; return(false); } } int currentImbricationMemoryVersion = memoryRef.GetVersionForImbrication(imbrication); if (currentImbricationMemoryVersion != memoryStartVersions[memoryRef]) { state = I_TRANSACTION_STATE.CONFLICT; return(false); } return(true); }
private void UpdateMemory(IInnerTransactionStmMemory memoryRef) { memoryRef.SetVersionForImbrication(imbrication, number); memoryRef.SetValue(memoryChanges[memoryRef]); }