12.2. �������

SQL ��׼�����������ڲ��е�����֮���������������ĸ������������롣 ��Щ��ϣ�������������ǣ�

�����dirty reads��

һ�������ȡ����һ��δ�ύ�IJ�������д�����ݡ�

�����ظ�����non-repeatable reads��

һ���������¶�ȡǰ���ȡ�������ݣ� ���ָ������Ѿ�����һ�����ύ�������޸Ĺ���

�ö���phantom read��

һ����������ִ��һ����ѯ������һ�׷��ϲ�ѯ�������У� ������Щ����Ϊ��������ύ������������˸ı䡣

�����ָ��뼶��Ͷ�Ӧ����Ϊ��Table 12-1 ��������

Table 12-1. SQL ������뼶��

���뼶�� �����Dirty Read�� �����ظ�����NonRepeatable Read�� �ö���Phantom Read��
��δ�ύ��Read uncommitted�� ���� ���� ����
�����ύ��Read committed�� ������ ���� ����
���ظ�����Repeatable read�� ������ ������ ����
�ɴ��л���Serializable �� ������ ������ ������

�� PostgreSQL �������������ֿ��ܵ�������뼶���е�����һ�֡� �������ڲ���ʵ����ֻ�����ֶ����ĸ��뼶�𣬷ֱ��Ӧ�����ύ�Ϳɴ��л��� �����ѡ���˶�δ�ύ�ļ���ʵ�������õ��Ƕ����ύ�� ����ѡ����ظ��Ķ������ʱ��ʵ�������õ��ǿɴ��л�������ʵ�ʵĸ��뼶����ܱ���ѡ��ĸ��ϸ� ���� SQL ��׼����ģ����ָ��뼶��ֻ���������������ܷ���������û�ж�����������һ�������� PostgreSQL ֻ�ṩ���ָ��뼶���ԭ���ǣ� ���ǰѱ�׼�ĸ��뼶�����汾�������Ƽܹ�ӳ����ص�Ψһ�ĺ������� ���õĸ��뼶�����Ϊ������С����������

12.2.1. �����ύ���뼶��

�����ύ��Read Committed�� �� PostgreSQL ���ȱʡ���뼶�� ��һ������������������뼶��ʱ�� һ�� SELECT ��ѯֻ�ܿ�����ѯ��ʼ֮ǰ�ύ�����ݶ���Զ�޷�����δ�ύ�����ݻ������ڲ�ѯִ��ʱ�������е������ύ���ĸı䡣 ������ SELECT ��ȷ���ü�ͬһ��������ǰ����µĽ������ʹ���ǻ�û�ύҲ���õ����� ʵ���ϣ�һ�� SELECT ��ѯ����һ���ڸò�ѯ��ʼ���е�˲������ݿ��һ�����ա� ��ע���������ڵ� SELECT ������ܿ�����ͬ�����ݣ�������������ͬһ������� ��Ϊ����������ڵ�һ��SELECTִ�е�ʱ���ύ��

UPDATE�� DELETE�� ���� SELECT FOR UPDATE ������Ŀ���е�ʱ�����Ϊ��SELECT һ���� ����ֻ���ҵ������ʼ��ʱ���Ѿ��ύ���С� ������������Ŀ�����ڱ��ҵ���ʱ������Ѿ�������������������£�����ɾ�������߱��Ϊ���µģ��� ����������£��������еĸ��½��ȴ���һ�����������ύ���߻ع�����������ڴ����� �����һ�����»ع�����ô�������ý������ԣ����ڶ��������߽���������������ֵ��С� �����һ���������ύ����ô�����һ��������ɾ���˸��У���ڶ��������߽����Ը��У� ����������ͼ�ڸ��е��Ѹ��µİ汾��ʩ�����IJ�����ϵͳ�����¼�����������������WHERE �Ӿ䣩�� ���������Ѹ��µİ첻���Ƿ���Ȼ������������������ǣ���ڶ������¼�����������Ӹ��е��Ѹ��°汾��ʼ��

��Ϊ����Ĺ������ڸ��µ�������ܻῴ����һ�µĿ��� — ���ǿ��Կ���Ӱ��������ͼ���µIJ������������Ч���� �������ǿ�������Щ��������ݿ��������е����á� ��������Ϊ������ύģʽ���ʺ����������漰����������������� �����������ڼ򵥵������������ȷ�ġ����磬�������������������������������������

BEGIN;
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
COMMIT;

�����������������ͼ�޸��ʺ� 12345 ���������Ǻ�����ϣ���ڶ��������Ǵ��ʻ��е��Ѿ����¹��İ汾�Ͻ��и��¡� ��Ϊÿ������ֻ��Ӱ��һ���Ѿ������˵��У���������������º�İ汾���ᵼ���κβ�һ�µ����⡣

��Ϊ�ڶ����ύģʽ�ÿ���µ�����Ǵ�һ���µĿ��տ�ʼ�ģ���������հ������е���ʱ��Ϊֹ�Ѿ��ύ������ ���ͬһ��������ĺ������������κ����ύ�IJ��������Ч���� ����Ҫ���ǵ�������������һ���������Ƿ񿴵����ݿ������һ�µ���ͼ��

�����ύģʽ�ṩ�IJ����������������Ӧ�ö������㹻�ģ��������ģʽ�ٶȿ죬ʹ�ü򵥡� ���������������Ӳ�ѯ�͸��µ�Ӧ�ã�������Ҫ��֤���ݿ��бȶ����ύģʽ�ṩ�ĸ����ϸ��һ������ͼ��

12.2.2. �ɴ��л����뼶��

�ɴ��л���Serializable�� �����ṩ���ϸ��������롣 �������ģ�⴮�е�����ִ�У� �ͺ������񽫱�һ������һ���������еģ������Dz��е�ִ�С� ������ʹ����������Ӧ�ñ���׼���ڴ��л�ʧ�ܵ�ʱ�����·�������

��һ�������ڿɴ��л����� һ�� SELECT ��ѯֻ�ܿ���������ʼ֮ǰ�ύ�����ݶ���Զ������δ�ύ�����ݻ�����ִ�����������������ύ���޸ġ� ��������SELECT ��ȷ���õ�ͬһ��������ǰ��ĸ��µ�Ч������ʹ����û���ύҲһ������ �����Ϊ�Ͷ����ύ�����Dz�̫һ�������� SELECT �������Ǹ�����ʼʱ�Ŀ��գ������Ǹ������ڲ���ǰ��ѯ��ʼʱ�Ŀ��ա� ������һ�������ڲ������ SELECT �������ǿ���ͬ�������ݡ�

UPDATE�� DELETE���� SELECT FOR UPDATE ������Ŀ�����ϵ���Ϊ�� SELECT һ���� ���ǽ�ֻѰ��������ʼ��ʱ���Ѿ��ύ��Ŀ���С����ǣ� ������Ŀ�����ڱ����ֵ�ʱ������Ѿ�������һ����������������ˣ�������ɾ�������DZ��Ϊ���£��� ����������£��ɴ��л������񽫵ȴ���һ�����ڸ��µ������ύ���߻ع����������Ȼ�ڴ����У��� �����һ�������߻ع�����ô����Ӱ�콫�����ԣ� ������ɴ��л��ľͿ��Լ���������������ֵ��С� ���������һ���������ύ�ˣ�����ʵ���ϸ��»���ɾ���˸��У�����ֻ��Ϊ����ѡ��������ô�ɴ��л����񽫻ع���������������Ϣ

ERROR:  Can't serialize access due to concurrent update

��Ϊһ���ɴ��л��������ڿɴ��л�����ʼ֮���ܸ��ı�����������Ĺ����С�

��Ӧ���յ������Ĵ�����Ϣʱ����Ӧ���˳���ǰ������Ȼ���ͷ��ʼ���½����������� �ڶ�������ʱ�������񿴵���ǰһ���ύ���޸��Ǹ����ݿ��ʼ�������е�һ���֣� ���԰��°汾������Ϊ��������µ���㲻�����߼���ͻ��

��ע��ֻ�и����������Ҫ���ԣ�ֻ���������û�д��л���ͻ��

�ɴ��л����񼶱��ṩ���ϸ�ı�֤��ÿ�����񶼿���һ����ȫһ�µ����ݿ����ͼ�� ������������и��������ݿⲻ��ά�ִ���ִ�е����ӣ���ôӦ�ñ���׼���������� ��Ϊ�������ӵ�����Ŀ��������Ƿdz��ɹ۵ģ���������ֻ�����ڸ��������а����㹻���ӵ��߼��� �ڶ����ύ�����п��ܵ��´���Ľ��������²�ʹ�á� ������ǣ��ɴ��л�ģʽֻ����������������DZ�Ҫ�ģ�һ���������������ɸ���� ���⼸��������뿴�����ݿ���ȫһ������ͼ��

12.2.2.1. �ɴ��л������������Ŀɴ��л�֮�Ƚ�

ִ�е�"�ɴ��л�"��ֱ�ۺ��壨�Լ���ѧ���壩�������ɹ��ύ�IJ��������Եú����ϸ�ش���ִ��һ���� һ������һ�� — �������ǿ����޷�Ԥ���ĸ�����ִ�С����DZ������ף���ֹ��Щ�� Table 12-1 �����г�����Ϊ�����ܱ�֤�����Ŀɴ��л��� ���ң�ʵ���� PostgreSQL �Ŀɴ��л�ģʽ������֤�����ֺ����µĿɴ��л��� ������˵������һ���� mytab���������

 class | value
-------+-------
     1 |    10
     1 |    20
     2 |   100
     2 |   200

����ɴ��л����� A ����

SELECT SUM(value) FROM mytab WHERE class = 1;

Ȼ��ѽ����30����Ϊ value �����У�class = 2�� ͬʱ��һ�������Ŀɴ��л������� B �����������

SELECT SUM(value) FROM mytab WHERE class = 2;

���һ�ȡ��� 300��Ȼ��������һ�����У�class = 1�� Ȼ�����������ύ�������г��Ľ�ֹ��Ϊ�����ᷢ�������������õ��Ľ���Dz��������κ�һ�ִ���ִ���¿����ġ� ��� A �� B ֮ǰִ�У�B Ӧ�ü�����ܺ� 330�������� 300�����������һ��˳����ô A ��������ۺ�Ҳ�᲻ͬ��

Ϊ�˱�֤������ѧ�ϵĿɴ��л���һ�����ݿ�ϵͳ����ǿ��ν�������� �����ζ��һ�������ܲ�����߸��������������У���������е�����ƥ������һ����������� WHERE ������ ���磬һ������ A ִ���˲�ѯ SELECT ... WHERE class = 1����ôһ��ν������ϵͳ����ֹ���� B �����κ� class Ϊ 1 �����У�ֱ�� A �ύ�� [1] ��������ϵͳʵ�������dz����ӣ�����ִ���������۸߰��� ��Ϊÿ���Ự������Ҫ֪��ÿ�����������ÿ����ѯ��ִ��ϸ�ڡ� �������������Ŀ����ڴ󲿷�����¶����˷ѵ��ģ� ��Ϊ��ʵ������´󲿷�Ӧ�ö������ᵼ��������������顣 ����Ȼ������������Ǿ�����Ƶģ����ܴ�����ʵ��������� ��ˣ�PostgreSQL ��δʵ��ν�������� ����������֪��û�������������е� DBMS ʵ���������

����Щ�Ǵ��л�ִ����Ŀ�����Σ�յij��ϣ�����ͨ��ʹ����ȷ����������������ķ��ϡ� ����������������С�ڽ��С�

Notes

[1]

ʵ���ϣ�һ��ν������ϵͳ�����˻ö���������Լ��д��Ķ������� MVCC ����ö��ķ�����Լ������ȡ�Ķ�����