Transações SQL Server 2012 – Parte 1

4 04 2013

Um dos termos mais comentados quando o assunto é banco de dados são as transações, por vezes observo no fórum MSDN pergunta a respeito, e nas turmas que ministro ao indagar sobre transações é grande o número de profissionais no mercado que conhecem parcialmente ou tem apenas uma noção sobre o assunto, pois bem, o objetivo desta postagem é esclarecer este conceito tão importante.

  1. O que é uma transação

Antes de nos aprofundarmos no assunto, é necessário entender o que vem a ser uma transação, uma pesquisa rápida no google pelo assunto nos mostrará inúmeras definições, com algumas palavras diferentes mas em sua maioria explanando de forma correta o que vem a ser uma transação, pois bem aqui vai minha definição sobre uma transação:

“Uma transação é uma unidade de trabalho que é executada por um banco de dados de forma única, atômica e isolada”.

Você pode encontrar conforme mencionei algumas variações desta definição, mas em sua maioria estão corretas, eu prefiro simplificar com a definição acima.

Esta definição deixa claro o princípio ACID para uma transação, mas o que é ACID?

  1. Princípios ACID

O princípio ACID define algumas características de uma transação, são eles:

  • Atomicidade

Uma transação é uma única unidade de trabalho, é indivisível e todas as operações devem ser refletidas no banco de dados em caso de sucesso ou nenhuma operação é refletida no banco de dados em caso de falha, ou todo o trabalho é concluído ou nada é concluído.

  • Consistência

Uma transação não pode infringir as regras de integridade do banco de dados, suas operações devem manter os dados consistentes.

  • Isolamento

Uma transação deve executar seu trabalho de forma isolada das demais transações que estão executando concorrentemente.

  • Durabilidade

Qualquer mudança no banco de dados concluída com sucesso deve permanecer mesmo em caso de falhas de sistema.

  1. Níveis de Isolamento

Com base nos princípios ACID uma das características de uma transação é que ela deve ser executada de forma isolada de outras transações, mas qual o motivo deste isolamento?

Se nós estamos trabalhando em um banco de dados onde não há concorrência ou ela é tão baixa que seja quase nula, não há necessidade de se preocupar muito com o isolamento das transações, pois a probabilidade de haver um conflito (duas ou mais transações tentando acessar o mesmo recurso) neste cenário é pífia.

Mas se estivermos trabalhando em um cenário de alta concorrência, o nível de isolamento das transações deve ser analisado com cuidado para evitar os seguintes problemas:

  1. Leitura Suja
  2. Atualizações Perdidas
  3. Leitura Não Repetível
  4. Dados Fantasmas

Leitura Suja

Um dos problemas mais comuns é a leitura suja, ela ocorre quando uma transação lê dados que ainda não foram persistidos (comitados) por outra transação, isto é um problema pois a transação que leu o dado “sujo” pode utilizá-lo em sua execução e este mesmo dado pode não existir depois caso a primeira transação não faça o “commit”.

Cenário:

T1 – Inicia Atualiza preço do produto Rollback (desfaz a atualização)
T2 – Inicia Lê preço atualizado (não comitado) Continua sua execução com o dado “sujo”

Atualizações Perdidas

Este problema ocorre quando uma transação faz uma atualização e ao término da sua execução sua atualização é sobrescrita por outra, ou seja, sua atualização torna-se perdida.

Cenário:

T1 – Inicia Obtém valor do melhor lance para um produto “X” (0) Faz uma atualização para o produto “X” definindo um valor para a oferta (100,00) Commit
T2 – Inicia Obtém valor do melhor lance para um produto “X” (0) Faz uma atualização para o produto “X” definindo um valor para a oferta (75,00) Commit

Neste cenário, a oferta feita pela transação T1 é perdida mesmo sendo melhor que a oferta da transação T2, prevaleceu o valor da transação que concluí por último, é como se a oferta de T1 não existisse.

Leitura Não Repetível

O problema da leitura não repetível ocorre quando uma transação não consegue executar a mesma leitura mais de uma vez pois os dados foram alterados por outra transação.

Cenário:

T1 – Inicia Obtém a soma dos pedidos de um período “X” para apresentar um relatório Continua sua execução… Tenta executar novamente a soma, desta vez o resultado sofreu alteração pela atualização de T2.
T2 – Inicia Atualiza um pedido que coincidentemente faz parte da soma de T1. Commit

Neste cenário, dizemos que a transação T1 não consegue executar a mesma leitura mais de uma vez durante sua execução, na primeira leitura obteve um resultado e quando tentou executar a mesma leitura novamente, obteve outro.

Dados Fantasmas

Dados fantasmas são dados que “aparecem” durante a execução de uma transação e por algum motivo “somem” depois.

Cenário:

T1 – Inicia Obtém a soma dos pedidos de um período “X” para apresentar um relatório Obtém novamente a soma, e percebe-se um valor diferente para a mesma leitura. Obtém novamente a soma, e desta vez o valor voltou ao estado original.
T2 – Inicia e Insere um pedido que coincidentemente faz parte do período da soma de T1 e faz commit. T2 – Inicia novamente, cancela o pedido inserido e faz commit.

Dizemos que neste caso, o pedido inserido por T2 é um pedido fantasma, não existia durante o inicio da execução de T1, “apareceu” no meio da execução e “sumiu” antes do término da execução influenciando na leitura.

É claro que para isto acontecer é necessário um cenário de alta concorrência, mas o problema existe e pode sim acontecer.

Continua na segunda parte.

Anúncios




Certificações SQL Server 2012

3 04 2013

Para inaugurar as postagens de 2013, começarei falando sobre a nova trilha de certificações para o SQL Server, veja como fica com a nova versão 2012.

As certificações agora estão divididas em três níveis:

  • MCSA – Microsoft Certified Solutions Associate
  • MCSE – Microsoft Certified Solutions Expert
  • MCSM – Microsoft Certified Solutions Master

Como você pôde observar as certificações da versão 2008 MCTS – Microsoft Certified Technology Specialist não existem mais, na versão 2008 do SQL Server era necessário ser aprovado em apenas um único exame para obter a credencial MCTS (70-432 ou 70-433), administração e desenvolvimento respectivamente, agora com a versão 2012 esta moleza não existe mais.

A credencial MCSA que podemos considerar uma credencial de “entrada” exige que o profissional seja aprovado em três exames, a saber:

70-461 – Querying Microsoft SQL Server 2012

70-462 – Administering Microsoft SQL Server 2012 Databases

70-463 – Implementing a Data Warehouse with Microsoft SQL Server 2012

Caso o profissional queira seguir adiante rumo a uma formação mais consolidada e obter a credencial MCSE, ainda é necessário ser aprovado em mais dois exames dependendo da especialidade, “Data Platform” ou “Business Intelligence”, são eles:

MCSE Data Platform

70-464 -Developing Microsoft SQL Server 2012 Databases

70-465 – Designing Database Solutions for SQL Server 2012

MCSE Business Intelligence

70-466 – Implementing Data Models and Reports with Microsoft SQL Server 2012

70-467 – Designing Business Intelligence Solutions with Microsoft SQL Server 2012

A credencial MCSM é o nível máximo de certificação para o SQL Server e existe apenas para a plataforma de dados, não está disponível para Business Intelligence, para obter esta certificação, além de ser MCSE em Data Platform, o profissional precisa ser aprovado no exame 88-986 e 88-987, este último não está disponível ainda e trata-se de laboratório.

A MCSM substitui a antiga MCM onde o profissional era submetido a um treinamento intensivo na sede da Microsoft com provas teóricas e laboratórios.

Mais detalhes sobre o programa de certificações do SQL Server 2012 acesse: http://www.microsoft.com/learning/en/us/sql-certification.aspx#fbid=LuFOPZuQvgn





Lista tipada para XML C#

11 02 2012

Hoje mostrarei um exemplo de como gerar um arquivo XML apartir de uma lista tipada.

1° Crie um projeto Console Application no Visual Studio 2008/2010 a versão que preferir.

2° Adicione uma nova Classe chamada Pessoa e crie as propriedades Nome,Sobrenome e Idade conforme imagem:

Classe Pessoa

3° Na classe Program crie o método GetXmlPessoas() conforme imagem, este método será responsável por retornar um XmlDocument customizado com os dados dos objetos Pessoa, recebe como parâmetro uma lista tipada de objetos Pessoa.

É necessário adicionar a referência using ao namespace: System.Xml

Método GetXmlPessoas

4 ° Ainda na classe Program, crie o  método GetListaPessoas que devolve uma lista tipada de objetos Pessoa,  e implemente o método Main.

Método getListPessoas e Implementação método Main

Ao executar o projeto, será impresso na tela uma String no formato xml, mas nada impede você de utilizar o xml retornado da forma que melhor atender sua necessidade.





Microsoft Technology Associate (MTA)

4 02 2012

A Microsoft possui uma certificação para os profissionais que estão dando os primeiros passos na área de TI e utilizam tecnologias Microsoft, é a credencial MTA.

Esta credencial garante que o profissinal possui os conhecimentos básicos em determinada área, desenvolvimento, infra, banco de dados, web, segurança etc.

É uma boa porta de entrada para quem ainda não possui nenhuma certificação Microsoft e não se considera preparado para encarar exames das séries MCTS,MCITP,MCPD e até MCM.

Esta certificação é semelhante a OCA – Oracle Certified Associate e a antiga SCA – Sun Certified Associate, ou seja, certificações que como eu disse, atestam conhecimentos básicos e por esse motivo são voltadas apenas para o público acadêmico, porém qualquer um pode prestar o exame.

Para saber mais detalhes sobre esta certificação visite: http://www.microsoft.com/learning/pt/br/certification/mta.aspx#certification





SQL Server 2012 RC

29 01 2012

Recentemente a Microsoft disponibilizou para download a versão RC (Release Candidate) do SQL Server 2012.

Segue abaixo links para download:

SQL Server 2012 RC

SQL Server 2012 RC Express

Como toda versão release, pode ser que a versão final venha com alguma funcionalidade diferente, mas já dá para ter uma noção de como será o Sql Server 2012 pois geralmente as versões que antecedem o lançamento são bem próximas da versão final do produto.





XML com SQL Server 2008

17 09 2011

Neste post apresentarei um recurso muito útil que é recuperar os dados do banco de dados em formato XML.

Em que situações é útil trabalhar com dados em formato XML?

Recuperar dados relacionais em formato XML

  • Invés de recuperar um result set tabular, você recupera um documento Xml, em casos onde não é possível efetuar um backup do banco você pode recuperar os dados em formato  XML.

Passar dados como XML para o banco de dados

  • útil para evitar inúmeras chamadas a procedures, você pode enviar o arquivo XML e efetuar uma inserção/atualização em lote.

Armazenar e consultar o documento XML no banco de dados

  • É possível criar uma coluna no banco para receber apenas documentos XML , como estão armazenados é possível recuperá-los e efetuar consultas neles.

Considere o modelo de dados abaixo:

Para recuperar apenas os clientes que possuem pedidos com seus respectivos produtos, uma consulta semelhante a esta resolve o problema.

Mas como obter o mesmo resultado em formato XML de forma que seja possível utilizá-lo com um objeto  XmlDocument simples ou XmlDataProvider do WPF para preencher uma coleção?

Abaixo uma query que atende o requisito proposto:

Observe que o resultado é um único registro contendo o documento xml abaixo:

A cláusula “FOR XML” indica que o result será um documento xml e a clásulula “PATH” o nome do nó, a cláusula TYPE indica que o result será um nó que pode conter outros results, e a cláusula ROOT indica a raiz do documento.

Também é possível notar que acrescentar “@” seguido de um alias, o Sql Server entende que aquela coluna será tratada como um atributo do elemento e não um nó.

Com esse exemplo é  possível criar inúmeras variações no formato do documento, basta apenas manipular a consulta para alterar o resultado, com o documento em mãos é só passá-lo para sua aplicação e trabalhá-lo como desejar.

té mais!





Estrutura de um aplicativo WPF

14 09 2011

Falarei neste post sobre como é estruturada uma aplicação WPF com o template WPF Application do Visual Studio 2010.

Quando criamos uma nova aplicação WPF com o template do VS2010, ele gera para nós alguns arquivos básicos, são eles:

  • App.xaml
  • App.xaml.cs
  • MainWindow.xaml
  • MainWindow.xaml.cs

Esses arquivos compõe toda a estrutura necessária para a aplicação funcionar, abaixo a descrição de cada um pela ordem inversa para facilitar o entendimento:

MainWindow.xaml

O arquivo MainWindow.xaml é o arquivo que contém toda a definição da Window(Janela) principal do aplicativo, porém como a extensão do arquivo sugere, é um arquivo XML para programação XAML que foi exemplificada no post anterior, ou seja, neste arquivo você irá encontrar apenas tags do WPF.

Na imagem acima é possível ver os namespaces necessários para elaboração da aplicação WPF assim como a referência “x:Class” que indica qual a classe resposável por esta definição de xaml além de uma definição inicial de Title,Height e Width.

MainWindow.xaml.cs

Este arquivo é reponsável por conter todo o código procedural da sua Window,  ou seja, código C# no meu caso.

Este arquivo nada mais é que uma classe que representa uma (Window) janela, e irá interagir com o código declarativo XAML do arquivo MainWindow.xaml.

A classe MainWindow é semelhante a classe Form do WindowsForms, em um projeto WindowsForms o VS gera um Form1 que herda de Form, em WPF é gerada uma classe MainWindow que herda de Window.

É possível criar outras Windows e apresentá-las usando o método Show() e fechá-las com o método Close().

App.xaml

O arquivo App.xaml.cs é o ponto de entrada da aplicação, é nele que é definido qual Window será inicializada primeiro.

O arquivo também possui referência aos namespaces do WPF e a definição “x:Class” que indica qual a classe relacionada ao arquivo.

A propriedade StartupUri indica qual Window será aberta ao iniciar a aplicação.

App.xaml.cs

Já o arquivo App.xaml.cs é a definição do código procedural do arquivo correspondente xaml, observe que a classe gerada “App”, herda da classe Application o que facilita o gerencimanto da aplicação.

Mas onde está o método Main?

Quando um aplicativo WPF é criado no Visual Studio, o projeto gerado não possui um método Main, se você tentar definir um método Main para sua aplicação ocorrerá um erro de compilação, pois isto já foi feito para você.

Application tem um mecanismo de armazenamento especial quando compilado a partir do XAML, o Visual Studio atribui ao arquivo XAML uma Build Action de ApplicationDefinition e isto faz com que um método Main seja gerado automaticamente.

O método Main é definido em um arquivo chamado App.g.cs que não fica visível em seu projeto.

Até a próxima!