Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }