PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 12. �������� | Fast Forward | Next |
SQL �������������ڲ��е�����֮���������������ĸ������������롣 ��Щ��ϣ�������������ǣ�
�����ָ��뼶��Ͷ�Ӧ����Ϊ��Table 12-1 ��������
Table 12-1. SQL ������뼶��
���뼶�� | �����Dirty Read�� | �����ظ�����NonRepeatable Read�� | �ö���Phantom Read�� |
---|---|---|---|
��δ�ύ��Read uncommitted�� | ���� | ���� | ���� |
�����ύ��Read committed�� | ������ | ���� | ���� |
���ظ�����Repeatable read�� | ������ | ������ | ���� |
�ɴ��л���Serializable �� | ������ | ������ | ������ |
�� PostgreSQL �������������ֿ��ܵ�������뼶���е�����һ�֡� �������ڲ���ʵ����ֻ�����ֶ����ĸ��뼶�𣬷ֱ��Ӧ�����ύ�Ϳɴ��л��� �����ѡ���˶�δ�ύ�ļ���ʵ�������õ��Ƕ����ύ�� ����ѡ����ظ��Ķ������ʱ��ʵ�������õ��ǿɴ��л�������ʵ�ʵĸ��뼶����ܱ���ѡ��ĸ��ϸ� ���� SQL ������ģ����ָ��뼶��ֻ���������������ܷ���������û�ж�����������һ�������� PostgreSQL ֻ�ṩ���ָ��뼶���ԭ���ǣ� ���ǰѱ��ĸ��뼶�����汾�������Ƽܹ�ӳ����ص�Ψһ�ĺ������� ���õĸ��뼶�����Ϊ������С����������
�����ύ��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����������������Ӧ�ö������㹻�ģ��������ģʽ�ٶȿ죬ʹ�ü� ���������������Ӳ�ѯ���µ�Ӧ�ã�������Ҫ��֤���ݿ��бȶ����ύģʽ�ṩ�ĸ����ϸ��һ������ͼ��
�ɴ��л���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�Ҫ�ģ�һ���������������ɸ���� ���⼸��������뿴�����ݿ���ȫһ������ͼ��
ִ�е�"�ɴ��л�"��ֱ�ۺ��壨�Լ���ѧ���壩�������ɹ��ύ�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��ϣ�����ͨ��ʹ����ȷ����������������ķ��ϡ� ����������������С�ڽ��С�
[1] | ʵ���ϣ�һ��ν������ϵͳ�����˻ö���������Լ��д��Ķ������� MVCC ����ö��ķ�����Լ������ȡ�Ķ����� |