笔记|事务处理
理解sql事故处理
1 在sql事务处理期间,由语句所完成的工作,在永久写入数据库之前都可以取消(使用rollback语句)。commit告诉dbms使数据库的变化成为永久的。
下面就来理解一下事务处理过程
如:begin transaction
语句1
语句2
语句3
语句4
在应用程序正常结束之前,4条修改语句并未提交,即未成为永久的,由此,异常结束将使得dbms取消由应用程序体中的所有4条sql语句所做的修改。
如果想让前两条修改后永久保存到数据库中,而不管后两条是否成功。可以执行如下事务。
如: begin transaction
语句1
语句2
commit transaction
begin transaction
语句3
语句4
2 在交互式会话期间,dbms默认为自动提交模式,这就意味着dbms自动地提交(使之成为永久的)每一条成功执行的sql语句的操作。因而,如果执行以下语句
delete from employees
将不能使用 rollback transaction 使删除的数据在恢复。
如何禁用自动提交模式呢?MS_SQL SERVER允许通过执行以下语句禁用自动提交模式
begin transaction
3 对带用大量语句时,可以使用存储点的方法,允许应用程序取消所做工作并恢复到事务处理中的特定点,由此,应用程序可对存储点使用rollback语句,重新做出事务处理中的部份语句所做的工作,而不必从头开始
如:begin transaction
create table trans_table
(row_number smallint,descrp varchar(35))
insert into trans_table values(1,'insert 1')
insert into trans_table values(2,'insert 2')
//存储点save1
save transaction save1
delete from trans_table where row_number = 2
insert into trans_table values(3,'insert 3')
insert into trans_table values(4,'insert 4')
//存储点save2
save transaction save2
delete from trans_table where row_number = 1
delete from trans_table where row_number = 3
rollback transaction save2
update trans_table
set descrp = 'row 1 after 2'
delete trans_table where row_number = 4
commit transaction
在执行上面语句后
执行 select * from trans_table
的结果如下:
row_number descrp
1 'row 1 after 2'
3 'row 1 after 2'