PostgreSQL�ϡ��ơ��֥���Υǡ������Ф���Ʊ���������������椹�뤿����͡��ʼ���Υ��å��⡼�ɤ������Ƥ��ޤ��� �����Υ⡼�ɤϡ�MVCC�Ǥ�ɬ�פ�ư��������ʤ���硢���ץꥱ�����������Υ��å��˻��Ѥ��뤳�Ȥ��Ǥ��ޤ��� �ޤ����ۤȤ�ɤ�PostgreSQL���ޥ�ɤǤϡ����Ȥ����ơ��֥뤬���Υ��ޥ�ɤμ¹�����̤���ˡ�Ǻ���⤷�����ѹ�����Ƥ��ʤ����Ȥ�μ¤ˤ��뤿��ˡ�Ŭ�ڤʥ⡼�ɤΥ��å���ưŪ�˳������ޤ� ���㤨�С�ALTER TABLE���ޥ�ɤϡ�Ʊ���ơ��֥���Ф���¾�����Ȥ�Ʊ���˼¹Ԥ��뤳�Ȥϴ����Ǥ��� ���Τ��ᡢ���Υơ��֥�ؤ���¾���å�����Ū�˳������ޤ����ˡ�
���ߤΥǡ����١��������Фǽ��פʥ��å��ΰ������ǧ����ˤϡ�pg_locks�����ƥ�ӥ塼����Ѥ��Ƥ��������� ���å��������֥����ƥ�ξ����ƻ�ˤĤ��Ƥξܺ٤���25���Ȥ��Ƥ���������
�ʲ��Υꥹ�Ȥˡ�PostgreSQL�Ǽ�ưŪ�˻��Ѥ���롢���Ѳ�ǽ�ʥ��å��⡼�ɤȤ���ʸ̮���ޤ��� �ޤ���LOCK���ޥ�ɤ���Ѥ��ơ������������å�������Ū�˳������뤳�Ȥ�Ǥ��ޤ��� �����Υ��å��⡼�ɤϡ����Ȥ�����̾����"row�ʹԡ�"�Ȥ������դ��դ��Ƥ��Ƥ⡢���ƥơ��֥��٥�Υ��å��Ǥ��뤳�Ȥ����դ��Ƥ��������� ���å��⡼�ɤ�̾�������Ū�ʤ�ΤǤ��� ������̾���ϡ��ƥ��å��⡼�ɤ���ɽŪ�ʻ�����ˡ������ɽ���Ƥ��ޤ��� ����������̣Ū�ˤ�����Ʊ���Ǥ��� ���å��⡼�ɴ֤ˤ�����ͣ��μ¼�Ū�ʺ��ۤϡ��ɤΥ⡼�ɤ��ɤΥ⡼�ɤȶ��礹�뤫�Ȥ������å��⡼�ɤ��Ȥ߹�碌�Ǥ��� 2�ĤΥȥ�������ǡ����礹��⡼�ɤΥ��å���Ʊ����Ʊ��ơ��֥����ݻ����뤳�ȤϤǤ��ޤ��� �ʤ��������ȥ�������ϼ�ʬ���ȤȤϷ褷�ƶ��礷�ޤ��� �㤨�С�ACCESS EXCLUSIVE���å�������������θ�Ʊ���ơ��֥��ACCESS SHARE���å���������뤳�Ȥ��Ǥ��ޤ��ˡ� ���礷�ʤ����å��⡼�ɤϡ�¿���Υȥ��������Ʊ�����ݻ����뤳�Ȥ���ǽ�Ǥ��� �äˡ����å��⡼�ɤˤϡ����ʶ��礹���Ρ��㤨�С�ACCESS EXCLUSIVE��Ʊ����ʣ���Υȥ���������ݻ����뤳�Ȥ��Բ�ǽ�ˤȡ����ʶ��礷�ʤ���Ρ��㤨�С�ACCESS SHARE��ʣ���Υȥ���������ݻ���ǽ�ˤ����뤳�Ȥ����դ��Ƥ���������
�ơ��֥��٥���å��⡼��
ACCESS EXCLUSIVE���å��⡼�ɤȤΤ߶��礷�ޤ���
SELECT���ޥ�ɤˤ�ꡢ���Ȥ����ơ��֥���Ф��Ƥ��Υ⡼�ɤΥ��å�����������ޤ��� �̾�ơ��֥���ɤ��Τߤ��ѹ���Ԥ�ʤ��䤤��碌�Ǥ�������ơ����Υ��å��⡼�ɤ�������ޤ���
EXCLUSIVE�����ACCESS EXCLUSIVE���å��⡼�ɤȶ��礷�ޤ���
SELECT FOR UPDATE�����SELECT FOR SHARE���ޥ�ɤϡ��ʻ��ȤϤ���Ƥ��뤬��FOR UPDATE/FOR SHARE�Ȥ�������Ϥ���Ƥ��ʤ�¾�Υơ��֥���Ф���ACCESS SHARE���å��˲ä��ơ��оݤȤʤ�ơ��֥��ˤ��Υ⡼�ɤΥ��å���������ޤ���
SHARE��SHARE ROW EXCLUSIVE��EXCLUSIVE�������ACCESS EXCLUSIVE���å��⡼�ɤȶ��礷�ޤ���
UPDATE��DELETE�������INSERT���ޥ�ɤϡ��ʻ��Ȥ����¾�����ƤΥơ��֥���Ф���ACCESS SHARE���å��˲ä��ơ��оݤȤʤ�ơ��֥��ˤ��Υ⡼�ɤΥ��å���������ޤ��� �̾���Υ��å��⡼�ɤϡ��ơ��֥�Υǡ������ѹ������䤤��碌�ˤ���������ޤ���
SHARE UPDATE EXCLUSIVE��SHARE��SHARE ROW EXCLUSIVE��EXCLUSIVE�������ACCESS EXCLUSIVE���å��⡼�ɤȶ��礷�ޤ��� ���Υ⡼�ɤˤ�ꡢƱ���¹Ԥ���륹�����ޤ��ѹ������VACUUM���ޥ�ɤμ¹Ԥ��顢�ơ��֥���ݸ�ޤ���
��FULL�ʤ��Ρ�VACUUM���ޥ�ɡ�ANALYZE���ޥ�ɡ�����ӡ�CREATE INDEX CONCURRENTLY�ˤ�äƳ�������ޤ���
ROW EXCLUSIVE��SHARE UPDATE EXCLUSIVE��SHARE ROW EXCLUSIVE��EXCLUSIVE�������ACCESS EXCLUSIVE���å��⡼�ɤȶ��礷�ޤ��� ���Υ⡼�ɤˤ�ꡢƱ���¹Ԥ����ǡ����ѹ�����ơ��֥���ݸ�ޤ���
��CONCURRENTLY�ʤ��Ρ�CREATE INDEX�ˤ�äƳ�������ޤ���
ROW EXCLUSIVE��SHARE UPDATE EXCLUSIVE��SHARE��SHARE ROW EXCLUSIVE��EXCLUSIVE�������ACCESS EXCLUSIVE���å��⡼�ɤȶ��礷�ޤ���
���Υ��å��⡼�ɤ�ưŪ�˳�������PostgreSQL���ޥ�ɤϤ���ޤ���
ROW SHARE��ROW EXCLUSIVE��SHARE UPDATE EXCLUSIVE��SHARE��SHARE ROW EXCLUSIVE��EXCLUSIVE������� ACCESS EXCLUSIVE���å��⡼�ɤȶ��礷�ޤ��� ���Υ⡼�ɤϡ�Ʊ���¹Ԥ����ACCESS SHARE�Τߤ���Ĥ��ޤ��� �Ĥޤꡢ���Υ��å��⡼�ɤ��ݻ�����ȥ���������¹Ԥ��Ƽ¹ԤǤ�������ϡ��ơ��֥���ɤ������Ǥ���
�桼���ơ��֥���Ф��Ƥ��Υ��å��⡼�ɤ�ưŪ�˳�������PostgreSQL���ޥ�ɤϤ���ޤ��� �����������������ˤ���������Υ����ƥ५���������Ф��ơ�����ϳ�������ޤ���
���ƤΥ��å��⡼�ɡ�ACCESS SHARE��ROW SHARE��ROW EXCLUSIVE��SHARE UPDATE EXCLUSIVE��SHARE��SHARE ROW EXCLUSIVE��EXCLUSIVE�������ACCESS EXCLUSIVE�ˤȶ��礷�ޤ��� ���Υ⡼�ɤˤ�ꡢ�����ݻ��ʳ��˥ơ��֥�˥�����������ȥ������ʤ����Ȥ��ݾڤ���ޤ���
ALTER TABLE��DROP TABLE��TRUNCATE��REINDEX��CLUSTER�����VACUUM FULL���ޥ�ɤˤ�äƳ�������ޤ��� �ޤ�������Ū�˥⡼�ɤ���ꤷ�ʤ���С����줬LOCK TABLEʸ����Ѥ���ݤΥǥե���ȤΥ��å��⡼�ɤǤ���
�ƥ��å�: ACCESS EXCLUSIVE���å��Τߤ���SELECT��FOR UPDATE/SHARE�ʤ���ʸ��֥��å����ޤ���
�̾���å��ϳ��������塢�ȥ�������ν����ޤ��ݻ�����ޤ��� �����������å��������֥ݥ���Ȥγ�Ω��˳������줿��硢�����֥ݥ���Ȥ�������Хå�����ȡ����å���¨�¤˲�������ޤ��� ����ϡ�ROLLBACK�������֥ݥ���Ȱʹߤ˹Ԥ�줿���٤ƤΥ��ޥ�ɤθ��̤��ä��Ȥ�����§�������������Ƥ��ޤ��� PL/pgSQL�㳰�֥��å���dz������줿���å����Ф��Ƥ�ƻ���Ǥ��� ���Υ֥��å����饨�顼��ȴ�����塢�������줿���å��ϲ�������ޤ���
�ơ��֥��٥���å��˲ä��ơ���¾���å��ޤ��϶�ͭ���å���Ԥ����Ȥ��Ǥ��롢�ԥ�٥���å�������ޤ��� ����ιԤ��Ф���ԥ�٥����¾���å��ϡ��Ԥ������ޤ��Ϻ���������˼�ưŪ�˳�������ޤ��� �ȥ��������ߥåȤޤ��ϥ�����Хå������ޤǡ��ơ��֥��٥���å���Ʊ�͡����Υ��å����ݻ�����ޤ��� �ԥ�٥���å��ϡ��ǡ������䤤��碌�ˤϱƶ���Ϳ���ޤ��� �ԥ�٥���å��ϡ�Ʊ���Ԥ��Ф�������Τߤ�֥��å����ޤ���
�ºݤ˹Ԥ��ѹ������˹Ԥ��Ф��ƹԥ�٥���å����������ˤϡ���������Ԥ�SELECT FOR UPDATE�����Ƥ��������� ���ä���ԥ�٥���å������������ȡ�������ۤ��ʤ��ǡ����Υȥ���������Ǥϲ���Ǥ�Ԥ��ѹ�����ǽ�Ǥ���Ȥ������Ȥ�Ф��Ƥ����Ƥ���������
����Ԥ��Ф���ԥ�٥�ζ�ͭ���å����������ˤϡ�SELECT FOR SHARE����Ѥ��Ƥ��ιԤ����Ƥ��������� ��ͭ���å��ϡ�¾�Υȥ�������ˤ��Ʊ����ͭ���å��γ������˳����ޤ��� ��������¾�Υȥ�������ͭ���å����ݻ����Ƥ���Ԥ��Ф��ơ��������������¾���å��γ�����Ԥ����Ȥ��Ǥ���ȥ�������Ϥ���ޤ��� �������ȡ���ͭ���å������������ޤǥ֥��å�����ޤ���
PostgreSQL�Ǥϡ��������ѹ����줿�Ԥξ�������ʤ����ᡢƱ���˥��å��Ǥ���Կ��ξ�¤Ϥ���ޤ��� ���������Ԥ���å�����ݤˡ��ǥ������˽����Ȥ�ȯ�����뤫�⤷��ޤ��� �������äơ��㤨��SELECT FOR UPDATE�ϡ����줿�Ԥ���å�������ΤȰ����դ��뤿����ѹ���Ԥ��ޤ��Τǡ��ǥ������ˤ��η�̤���ळ�Ȥˤʤ�ޤ���
�ơ��֥�ȹԥ��å��˲ä����ڡ�����٥�ζ�ͭ/��¾���å������ꡢ�����϶�ͭ�Хåե��ס���ˤ���ơ��֥�ڡ����ؤ��ɤ߽Υ���������������뤿��˻��Ѥ���ޤ��� �����Υ��å��ϡ��Ԥ��������줿��乹�����줿���¨�¤˲������ޤ��� ���ץꥱ�������ȯ�Ԥ��̾�ڡ�����٥���å����θ����ɬ�פϤ���ޤ��� ���å��ˤĤ������Ƥ������������ä�����ڡ�����٥���å����������ޤ�����
����Ū�ʥ��å��λ��Ѥϡ��ǥåɥ��å��θ����Ȥʤ��ǽ��������ޤ��� �ǥåɥ��å��Ȥϡ�2�ġʤ⤷���Ϥ���ʾ�ˤΥȥ�������ˤ����ơ����줾�줬��¾���Υȥ�������ɬ�פȤ�����å��������Ƥ��ޤ����ȤǤ��� �㤨�С��ȥ�������1���ơ��֥�A����¾���å���������Ƥ��ơ����˥ơ��֥�B����¾���å���������褦�Ȥ���ݤˡ��ȥ�������2�����˥ơ��֥�B����¾���å�������ѤߤǤ��äơ�������ơ��֥�A����¾���å���������褦�Ȼ�ߤ��硢�ɤ���Υȥ�������������ʤ���ޤ��� PostgreSQL�Ǥϡ���ưŪ�˥ǥåɥ��å��������Τ����ط�����ȥ�������ΰ����ܡ��Ȥ��뤳�Ȥˤ�ꡢ���ξ������褷���⤦�����Υȥ�������ν�����λ�����ޤ� �ʤɤ���Υȥ�������ܡ��Ȥ��뤫�����Τ�ͽ������Τ���������˰�¸���٤��ǤϤ���ޤ���ˡ�
�ǥåɥ��å��Ϲԥ�٥���å��η�̤Ȥ���ȯ�������ǽ��������ޤ� �ʤ������äơ�����Ū�ʥ��å���������Ѥ��Ƥ��ʤ��Ƥ�ȯ�������ǽ��������ޤ��ˡ� 2�Ĥ�Ʊ���¹ԥȥ���������ơ��֥���ѹ����������ͤ��Ƥߤޤ��� 1���ܤΥȥ�������ϰʲ���¹Ԥ��ޤ���
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 11111;
����ϡ����ꤷ�������ֹ�ιԤ��Ф��ԥ�٥���å���������ޤ��� ����2���ܤΥȥ������ʲ���¹Ԥ��ޤ���
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 22222; UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 11111;
1���ܤ�UPDATEʸ�ϻ��ꤵ�줿�Ԥ��Ф���ԥ�٥���å��γ����������������ιԤι������������ޤ��� ��������2���ܤ�UPDATEʸ�ϡ������оݤιԤ����å�����Ƥ��뤳�Ȥ��Τ������å�����������ȥ�������λ����ޤ��Ե����ޤ��� �ȥ�������2�ϡ������ǡ�³����¹Ԥ������˥ȥ�������1����λ����Τ��Ե����Ƥ��ޤ��� ���ơ��ȥ�������1�������ǰʲ���¹Ԥ��ޤ���
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 22222;
�ȥ�������1�ϻ��ꤷ���Ԥιԥ�٥���å���������褦�Ȥ��ޤ�����������Բ�ǽ�Ǥ��� �ȥ�������2�����Υ��å�����˳������Ƥ��뤫��Ǥ��� ���Τ��ᡢ�ȥ�������2����λ����Τ��Ե����뤳�Ȥˤʤ�ޤ��� �������ơ��ȥ�������1�ϥȥ�������2�ǥ֥��å����졢�ȥ�������2�ϥȥ�������1�ǥ֥��å�����롢�Ĥޤꡢ�ǥåɥ��å����֤Ǥ��� PostgreSQL�ϥǥåɥ��å����֤��Τ��������Υȥ�����������Ǥ����ޤ���
�ǥåɥ��å����ɤ��Ǥ��ɤ���ˡ�ϡ��ǡ����١�������Ѥ������ƤΥ��ץꥱ��������������Τ�������ʣ���Υ��֥������Ȥ��Ф�����å���������뤳�ȤǤ��� ���˼������ǥåɥ��å�����ǡ��⤷ξ���Υȥ��������Ʊ������ǹԤ����Ƥ�����ǥåɥ��å��ϵ�����ޤ��� �ޤ����ȥ���������Υ��֥������Ȥ��Ф��Ƴ��������ǽ�Υ��å��������Υ��֥������Ȥ�ɬ�פȤ���ǹ�̤Υ⡼�ɤǤ��뤳�Ȥ�μ¤��ݾڤ��٤��Ǥ��� ���Τ��Ȥ������˸��ڤǤ��ʤ���硢�ǥåɥ��å��ˤ�ꥢ�ܡ��Ȥ��줿�ȥ��������ƻ�Ԥ���С��ǥåɥ��å���ǡ����١������Ư�����ʤ���Ǥ�������뤳�Ȥ��Ǥ��ޤ���
�ǥåɥ��å����������Ф���ʤ���С��ơ��֥��٥���å��⤷���Ϲԥ�٥���å����᤹��ȥ�������ϡ����礹����å������������ޤǡ�̵���¤��Ե����ޤ��� �������äơ����ץꥱ��������Ĺ���֡��㤨�С��桼���������Ԥ��˥ȥ�����������ޤ��ݻ����Ƥ����Τϡ��侩����ޤ���
PostgreSQL�ϡ����ץꥱ��������ȼ��ΰ�̣����ĥ��å������������ˡ�����ޤ��� ����ϡ����λ��Ѥ˴ؤ��ƥ����ƥ�ˤ�����¤��ʤ����ȡ��Ĥޤꡢ���������Ѥ˴ؤ��Ƥϥ��ץꥱ���������Ǥ����Ĥ��Ȥ�������Ū���å��ȸƤФ�ޤ��� ����Ū���å��ϡ�MVCC�����˹�碌�Ť餤���å���ά��ͭ�Ѥ˻��Ѥ��뤳�Ȥ��Ǥ��ޤ��� ����Ū���å�����������塢����Ū�˲������뤫���Υ��å�������ޤǡ����å����ݻ�����ޤ��� ɸ����å��Ȱۤʤꡢ����Ū���å��ϥȥ�������Ȥ�����̣�ˤϽ����ޤ��� ���å����ȥ������������˳������졢���Υȥ���������ǥ�����Хå������Ȥ��Ƥ⡢������Хå�����ݻ�����ޤ��� �����ơ��ƤӽФ����Υȥ�������Ǽ��Ԥ����Ȥ��Ƥ���å������ͭ���Ǥ��� ��ͭ����ץ���������ǡ�Ʊ��Υ��å���ʣ����������뤳�Ȥ�Ǥ��ޤ��� ���ξ�硢�ġ��Υ��å�����Ф��ơ����å���ºݤ˲������������б�������å������ʤ���Фʤ�ޤ��� �ʴ��˥��å�����ꤵ�줿���å����ݻ����Ƥ����硢¾�Υ��å�����Υ��å��������Ե����Ƥ����Ȥ��Ƥ⡢�ɲä���Ͼ���������ޤ����� ���٤Ƥ�PostgreSQL�Υ��å���Ʊ�͡� Ǥ�դΥ��å����Ǹ����ݻ�����Ƥ��봫��Ū���å��Ϥ��٤ơ�pg_locks�����ƥ�ӥ塼�����Ƥ��ޤ���
����Ū���å��϶�ͭ����ס���γ����˳�����Ƥ�졢�������̤�max_locks_per_transaction��max_connections�����ѿ��ˤ����ꤵ��ޤ��� ���Υ����ϲ�ʤ��褦�����դ�ɬ�פǤ��� ����ʤ��ȡ������Фϥ��å�������ޤä������Ĥ��뤳�Ȥ��Ǥ��ʤ��ʤ�ޤ��� ����ϡ������Фǵ��ĤǤ��봫��Ū���å����˾�¤����뤳�Ȥ��̣���ޤ��� �����Ф�����ˤ��ޤ������̾1������10�����٤ˤʤ�ޤ���
����Ū�ʴ���Ū���å��λ�����ˡ�ϡ��褯"�ե�åȥե�����"�ǡ������������ƥ�ȸƤФ�롢���Ū�ʥ��å���ά���ϵ����뤳�ȤǤ��� �������ӤΤ���˥ơ��֥���˥ե饰���Ǽ���뤳�Ȥ�Ǥ��ޤ���������Ū���å���������®�ǡ�MVCC����ĥ���ɤ����Ȥ��Ǥ��ޤ��� �ޤ������å����λ���˥����Фˤ�뼫ư������Ԥ����Ȥ�Ǥ���褦�ˤʤ�ޤ��� SQL����ɾ������Ȥ��������顢���μ�ˡ��μ¤˻��Ѥ���������ä�����Ū�ʽ���դ���LIMIT�������䤤��碌�Ǥϡ����դ��ƥ��å����������椷�Ƥ��������� �ʲ�������ޤ���
SELECT pg_advisory_lock(id) FROM foo WHERE id = 12345; -- ����ʤ� SELECT pg_advisory_lock(id) FROM foo WHERE id > 12345 LIMIT 100; -- ������ SELECT pg_advisory_lock(q.id) FROM ( SELECT id FROM foo WHERE id > 12345 LIMIT 100; ) q; -- ����ʤ�
�����Ǥϡ����å������ؿ����¹Ԥ��������LIMIT ��Ŭ�Ѥ���뤳�Ȥ��ݾ�Ǥ��ʤ����ᡢ2���ܤη����ϴ����Ǥ��� ����ˤ�ꡢ���ץꥱ����������ꤷ�Ƥ��ʤ��ʤ�Υ��å�������������ǽ��������ޤ��� ���Τ��ᡢ�ʥ��å����λ����ޤǡ˲����˼��Ԥ��뤳�Ȥˤʤ�ޤ��� ���ץꥱ������鸫��ȡ������������å��Ϥ����ξ���Ǥ�����pg_locks����ϻ��Ȥ���³���ޤ���
����Ū���å�������δؿ��ˤĤ��Ƥϡ�ɽ9-50���������ޤ���