3.4. ����

�������������ݿ�ϵͳ��һ��������� һ�������Ҫ��������Ѷ�������������һ����һ�ģ����ɹ�����ʵIJ����� ���������������ǿ���������Щ����֮����м�״̬�ģ��������������һЩ���⣬ ���¸������޷���ɣ���ô������Щ���趼��ȫ����Ӱ�����ݿ⡣

���磬����һ�����е����ݿ�������ֿͻ��ʻ������Լ�ÿ�����е����� ��������Ҫ��¼һ�δ� Alice ���ʻ��� Bob ���ʻ��Ľ��Ϊ $100.00 ��֧����������ô������������ļ򵥵������ SQL ��������������

UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
UPDATE branches SET balance = balance - 100.00
    WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Alice');
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
UPDATE branches SET balance = balance + 100.00
    WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Bob');

��Щ�����ϸ�������������Ҫ����Ҫ��������ǣ�浽�˺ü��������ĸ������������൱�򵥵IJ����� ���ǵ����й�Ա��ϣ��Ҫô������Щ���¶���Ч��Ҫôȫ���������á� ���ǵ�Ȼ��ϣ��һ��ϵͳ�����͵��� Bob �յ� 100 �鲻�� Alice ֧����Ǯ�� Ҳ��ϣ�� Alice ���Dz���Ǯ�� Bob �����õ���Ʒ��������Ҫ��֤������ڲ����Ĺ����г��˲�� ��ô������Щ���趼���ᷢ��Ч��������Щ������ϳ�һ�������͸������������ı�֤�� ������Ϊ��ԭ�ӵ�������������ĽǶ���������Ҫô��ȫ��������Ҫô��ȫ��������

���ǻ���Ҫ��֤��һ��һ��������ɲ��ҵõ����ݿ�ϵͳ���Ͽɣ� ��ô�����뱻�������õش洢�����Ҳ��������ı�������ʧ�� ���磬������Ǽ�¼����һ�� Bob �����Ķ����� ��ô���Dz�ϣ�����������߳����д���֮���һ�α����ͻᵼ�¶������ʻ��Ŀۼ�������ʧ�� һ�����������ݿⱣ֤һ���������������и��������񷢳������Ӧ֮ǰ����¼�����õĴ洢�У�Ҳ���Ǵ��̣���

���������ݿ������һ����Ҫ�����ʺ�ԭ�Ӹ��µĸ����ϵ���У� ��������񲢷������е�ʱ����ôÿ�����񶼲�Ӧ������������������δ��ɵı仯�� ���磬���һ��������æ�ż������з��е�����ܺͣ� ��ô����Ӧ�ð������� Alice �ķ��еĿ��ʺ����� Bob ���е����ʣ���֮��Ȼ�� ������������Ǻڰ׷����ģ����������������������ݿ��ϲ���������Ӱ�����������������������תʱ������Ŀ������ϡ� һ���򿪵��������ĸ����������֮ǰ�����������޷������ģ������ύ��ʱ�����и���ͬʱ�ɼ���

�� PostgreSQL �һ��������ͨ���� SQL ������ BEGIN �� COMMIT �����Χʵ�ֵġ� ������ǵ���������ʵ���Ͽ���������������

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
-- �ȵ�
COMMIT;

����ڸ�����Ĺ����У����Ǿ��������ύ�����������Ǹշ��� Alice ������Ǹ������� ��ô���ǿ��Է��� ROLLBACK ��������� COMMIT �����ô��ĿǰΪֹ���ǵ����и��¶��ᱻȡ����

PostgreSQL ʵ���ϰ�ÿ�� SQL ��䵱����һ��������ִ�е��������� �����û�з��� BEGIN �����ôÿ����������䶼��һ�������� BEGIN �ͣ�����ɹ��Ļ��� COMMIT ����Χ����Χ�� һ���Χ�� BEGIN �� COMMIT ����м�������ʱ�򱻳����������

ע��: һЩ�ͻ����Զ����� BEGIN �� COMMIT�� �������ܲ���Ҫ��������Ϳ��Ի�ȡ������Ч�����鿴��ʹ�õĽӿڵ��ĵ���

���ǿ���ͨ��ʹ�� savepoints �ķ�������һ����������Ӿ�ϸ�ؿ������е���䡣 �������������ѡ���Ե����������е�ijЩ���֣����ύ����ʣ�µġ� ���� SAVEPOINT ������һ�������������Ҫ�������ʹ�� ROLLBACK TO �ع����ñ���㡣 ��������ڶ��屣��㵽�ع�����֮����������ݿ���Ķ��������������ڱ����֮ǰ���޸Ľ���������

�ڻع���һ�������֮������������Ȼ�������䶨�壬��������Իع������λ�úü��Ρ� ��Ȼ�������ȷ���㲻��Ҫ�ٴλع���һ������㣬��ô������ͷ���������ϵͳ�����ͷ�һЩ��Դ�� Ҫ��ס���ͷŻ��߻ع���һ������㶼���Զ��ͷ������������б���㡣

������Щ��������һ��������ڲ�������������Щ�������ܱ���������Ự������ ���ҽ������ύ���������飬��Щ�ύ�˵Ķ���������һ����Ը�ķ�ʽ�������Ự������ ���ع��Ķ�����ȫ�����ٱ�������

���ǵ����ǵ��������ݿ��𣿼������Ǵ� Alice ���ʻ������� $100.00�� Ȼ��� Bob ���ʻ����д��Ǽӿ�Ժ����Ƿ�������Ӧ�ø� Wally ���˺Ŵ��Ǽӿ ��ô���ǿ��������������ı����������

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
-- ѽ���Ӵ�Ǯ�ˣ�Ӧ���� Wally ���˺�
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Wally';
COMMIT;

������ӵ�Ȼ��ʵ��̫���ˣ�����ͨ��ʹ�ñ���㣬���ǿ��Զ�������д����Ŀ��ơ� ���ң�ROLLBACK TO �dz�������ȫ���ع�����������֮���Ψһ���õģ� �������¿���һ����������ϵͳ�����˳�״̬�µ�����ķ�����