private FreeData ReturnFreeData(Transactions Transactions, LockDataType LockDataType, string Dado) { // Verifica se o dado está lockado para alguma sessão if (TransactionDataLock.ContainsKey(Dado)) { DataLockTransactions usedData = TransactionDataLock[Dado]; // Verifica se está lockado para a transação que está tentando acessar. if (usedData.CheckLockForTransaction(Transactions.TransactionNumber)) { /* Se o tipo de dado for restrito deve ter lock exclusivo, neste caso * não pode estar lockado para outras transações */ if (LockDataType.Equals(LockDataType.Exclusive) && usedData.NumberOfTransactions() > 1) { return(FreeData.ExclusiveOtherTransactionsData); } else { return(FreeData.SharedTransactionsData); } } // Verifica se tem lock exclusivo para outra sessão. else { /* Adiciona à lista de espera quando estiver lock exclusivo para outra transação * Ou quando a transação pediu lock exclusivo */ if (usedData.LockType.Equals(LockDataType.Exclusive) || LockDataType.Equals(LockDataType.Exclusive)) { return(FreeData.ExclusiveOtherTransactionsData); } else { return(FreeData.OtherSharedTransactionsData); } } } // Quandoo dado não está sendo utilizado por nenhuma sessão else { return(FreeData.FreeData); } }
private string CheckDeadLock(int TransactionNumber, string Dado, List <int> TransacoesWaiting) { string retorno = "-1|x"; DataLockTransactions TransactionsUsingData; // Se não existir o dado é pq a transação já foi abortada if (TransactionDataLock.ContainsKey(Dado)) { TransactionsUsingData = TransactionDataLock[Dado]; foreach (var transactionNumber in TransactionsUsingData.ReturnTransactions()) { // Não verifica a própria transação if (!transactionNumber.Equals(TransactionNumber)) { // Adiciona na lista e verifica se ocorreu dead lock. if (TransactionsList[TransactionNumber].LockType.Equals(TransactionTypeLock.Waiting)) { if (TransacoesWaiting.Contains(TransactionNumber)) { // Elimina deadlock int eliminatedTransaction = RemoveDeadLock(TransacoesWaiting); retorno = eliminatedTransaction + "|" + ReturnTransactionsCycle(TransacoesWaiting, eliminatedTransaction); } else { TransacoesWaiting.Add(TransactionNumber); // Retorna dado que a transação está espera. TransactionQueueCommand commandsTransactions = WaitingTransactionsList[TransactionNumber]; // Verifica pendencias desta transação. retorno = CheckDeadLock(TransactionNumber, commandsTransactions.WaitingData, TransacoesWaiting); } } } } } return(retorno); }