Slides da palestra apresentada no DevCamp 2015.
Você, caro programador, já deve ter tido problemas por ter assumido algumas meia-verdades.
Quando estamos desenvolvendo, muitas vezes assumimos saber de algo sem nem ao menos pensar no assunto, eis as 5 classes de situações mais problemáticas (ou mais interessantes):
1. Tratamento de data/hora, problemas com fuso horário e horário de verão
2. Pessoas têm nomes, nem sempre tão simples como você imagina
3. Endereços também não são tão simples assim
4. Precisão de pontos flutuantes
5. Concorrência em bancos de dados (relacionais)
Causas e efeitos serão vistos, mas também vamos ver a solução para esses problemas (muitas vezes bem simples). Talvez você economiza várias horas de refactoring, correção de bug, atualização de dados, simplesmente ao assistir esta palestra.
3. Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
Instrutor dos treinamentos PostgreSQL
Concepção, desenvolvimento e suporte à
produção
4. Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionais
capacitados em todo o Brasil.
http://www.dextraining.com.br/
“Aprenda com quem faz na prática”
Concepção, desenvolvimento e suporte à
produção
5. Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionais
capacitados em todo o Brasil.
http://www.dextraining.com.br/
“Aprenda com quem faz na prática”
SaaS para análise e monitoramento PostgreSQL
http://www.pganalytics.com.br/
“Facilitando a vida do DBA”
8. Tratamento de data/hora
• todo dia tem 24 horas?
5 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
9. Tratamento de data/hora
• todo dia tem 24 horas?
◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o
mesmo resultado, certo?
5 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
10. Tratamento de data/hora
• todo dia tem 24 horas?
◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o
mesmo resultado, certo?
postgres =# SELECT ts , ts - i n t e r v a l ’1 day’ FROM
datahora;
ts | ?column?
------------------------+------------------------
2015 -10 -19 00:00:00 -02 | 2015 -10 -18 01:00:00 -02
(1 row)
postgres =# SELECT ts , ts - i n t e r v a l ’24 hours ’ FROM
datahora;
ts | ?column?
------------------------+------------------------
2015 -10 -19 00:00:00 -02 | 2015 -10 -17 23:00:00 -03
(1 row)
5 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
11. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
12. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
13. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
14. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
15. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
16. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
17. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
18. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
◦ o fuso horário do servidor não vai mudar
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
19. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
◦ o fuso horário do servidor não vai mudar
◦ a data/hora do servidor não volta, só avança
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
20. Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
◦ o fuso horário do servidor não vai mudar
◦ a data/hora do servidor não volta, só avança
◦ ... http://infiniteundo.com/post/25326999628/
falsehoods-programmers-believe-about-time
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
21. Não existem “apenas” 24 fuso horários
7 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
23. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
24. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
25. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
26. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente
compartilhado entre irmãos), nome
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
27. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente
compartilhado entre irmãos), nome
◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome,
sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
28. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente
compartilhado entre irmãos), nome
◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome,
sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe
◦ José Eduardo Santos Tavares Melo Silva – Brasil
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
29. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
30. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome
do pai, nome, sobrenome
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
31. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome
do pai, nome, sobrenome
◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai,
sobrenome, casta
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
32. Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome
do pai, nome, sobrenome
◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai,
sobrenome, casta
• OBS: Exemplos aproximados, sobrenome é o nome da família ou
como deve-se referenciar com Sr./Sra./etc. Mais detalhes, com
mesmos exemplos, em http:
//www.w3.org/International/questions/qa-personal-names
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
33. Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
34. Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
35. Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
36. Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
37. Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
38. Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”?
◦ Se eu uso “Matheus”, “de Oliveira”:
Autor: DE OLIVEIRA, Matheus.
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
39. Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”?
◦ Se eu uso “Matheus”, “de Oliveira”:
Autor: DE OLIVEIRA, Matheus.
◦ “Matheus de”, “Oliveira”:
e-mail: Olá Matheus de, você acaba de ganhar 1 milhão de reais!
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
40. Ok, e como devemos criar nossos formulários?
• Não há solução então?
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
41. Ok, e como devemos criar nossos formulários?
• Não há solução então?
◦ A verdade é que depende do uso, uma solução aceita é pedir:
• Nome completo: ...
• Como devemos chamá-lo: ...
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
42. Ok, e como devemos criar nossos formulários?
• Não há solução então?
◦ A verdade é que depende do uso, uma solução aceita é pedir:
• Nome completo: ...
• Como devemos chamá-lo: ...
• Legal, e o campo para tratamento Sr./Sra./Dr./etc.?
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
43. Ok, e como devemos criar nossos formulários?
• Não há solução então?
◦ A verdade é que depende do uso, uma solução aceita é pedir:
• Nome completo: ...
• Como devemos chamá-lo: ...
• Legal, e o campo para tratamento Sr./Sra./Dr./etc.?
◦ Alguns tratamentos vêm no início (Dr./Sr./Sra./etc.), outros no fim
(“, PhD”)
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
45. Endereços também não são tão simples assim
• Errado:
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
46. Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
47. Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
48. Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
49. Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
50. Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
51. Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
52. Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
◦ Tá, mas nome de rua é único dentro cidade
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
53. Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
◦ Tá, mas nome de rua é único dentro cidade
◦ Nome de rua, cidade, bairro, nunca muda
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
54. Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
◦ Tá, mas nome de rua é único dentro cidade
◦ Nome de rua, cidade, bairro, nunca muda
◦ ... https://www.mjt.me.uk/posts/
falsehoods-programmers-believe-about-addresses/
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
56. Precisão de pontos flutuantes
• Devemos usar os tipos double,float,real,... sempre que
trabalhamos com decimais (moeda, volume, etc.)?
16 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
57. Precisão de pontos flutuantes
• Devemos usar os tipos double,float,real,... sempre que
trabalhamos com decimais (moeda, volume, etc.)?
UPDATE venda_item
SET valor_real = valor , qtd_real = qtd ,
valor_double = valor , qtd_double = qtd;
SELECT sum(valor * qtd) AS soma ,
sum(valor_real * qtd_real) AS soma_real ,
sum(valor_double * qtd_double) AS soma_double
FROM venda_item;
soma | soma_real | soma_double
-------------+-----------+------------------
183802.5000 | 183804 | 183802.499999927
◦ soma = numeric/decimal
◦ soma_real = float (4 bytes)
◦ soma_double = double precision (8 bytes)
16 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
59. Concorrência em bancos de dados (relacionais)
• Errado:
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
60. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
61. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
Solução: sequence, serial, auto_increment
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
62. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
Solução: sequence, serial, auto_increment
◦ Inserir ou atualizar um registro:
UPDATE acesso SET contador = contador + 1
WHERE url = p_url AND usuario = p_usuario;
IF (NOT FOUND) THEN
INSERT INTO acesso(url , usuario , contador)
VALUES (p_url , p_usuario , 1);
END IF ;
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
63. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
Solução: sequence, serial, auto_increment
◦ Inserir ou atualizar um registro:
UPDATE acesso SET contador = contador + 1
WHERE url = p_url AND usuario = p_usuario;
IF (NOT FOUND) THEN
INSERT INTO acesso(url , usuario , contador)
VALUES (p_url , p_usuario , 1);
END IF ;
Solução: tratamento de erro (falha no INSERT, tenta UPDATE
novamente), MERGE, INSERT OR REPLACE, INSERT ... ON
CONFLICT UPDATE, ...
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
64. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Trigger para atualizar estoque:
SELECT qtd_estoque INTO v_qtd
FROM produtos
WHERE produto_id = NEW.produto_id;
UPDATE produtos
SET qtd_estoque = v_qtd - NEW.qtd
WHERE produto_id = NEW.produto_id;
19 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
65. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Trigger para atualizar estoque:
SELECT qtd_estoque INTO v_qtd
FROM produtos
WHERE produto_id = NEW.produto_id;
UPDATE produtos
SET qtd_estoque = v_qtd - NEW.qtd
WHERE produto_id = NEW.produto_id;
Solução: um único UPDATE
UPDATE produtos
SET qtd_estoque = qtd_estoque - NEW.qtd
WHERE produto_id = NEW.produto_id;
19 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
66. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Trigger para atualizar estoque:
SELECT qtd_estoque INTO v_qtd
FROM produtos
WHERE produto_id = NEW.produto_id;
UPDATE produtos
SET qtd_estoque = v_qtd - NEW.qtd
WHERE produto_id = NEW.produto_id;
Solução: um único UPDATE
UPDATE produtos
SET qtd_estoque = qtd_estoque - NEW.qtd
WHERE produto_id = NEW.produto_id;
Ou então, use a cláusula FOR UPDATE no SELECT
19 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
67. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
68. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
• SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
69. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
• SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção
• Ok, mas pelo menos ORDER BY id me traz a ordem de inserção
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
70. Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
• SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção
• Ok, mas pelo menos ORDER BY id me traz a ordem de inserção
• Sério? Ah, mas ORDER BY id e ORDER BY data_insercao são
equivalentes
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
71. Resumindo...
1. Marcar tempo é complexo, use sempre valor absoluto (ou um tipo
que use-o internamente)
2. Pessoas têm nomes “estranhos”, e não gostam quando você os erra!
3. Vida de carteiro não é fácil
4. float/double/real/... não têm boa precisão
5. Vai ter mais de um usuário em produção, pense sempre em
concorrência
21 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015