事务的概念:简单说就访问并可能更新数据库中各类数据项的一个程序执行单元,一旦开启事务,全部对数据的操做要么所有执行,要么所有都不执行。单条sql语句自己就是一个事务.sql
事务的属性:数据库
事务是做为单个逻辑工做单元执行的一系列操做。一个逻辑工做单元必须有4个属性,称为原子性(Atomic)、 一致性(Consistent)、隔离性(Isolated)、持久性(Durable),简称ACID属性,只有这样才能构成一个事务。spa
原子性:整个事务中的全部操做,要么所有完成,要么所有不完成,不可能停滞在中间某个环节。事务在执行过程当中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务历来没有执行过同样。.net
一致性:在事务开始以前和事务结束之后,数据库的完整性约束没有被破坏。code
隔离性:两个事务的执行是互不干扰的,一个事务不可能看到其余事务运行时,中间某一时刻的数据。blog
持久性:在事务完成之后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。事务
工做开发过程当中对事务的依赖性很强,复杂一点的sql操做通常都离不开事务.开发
举个很简单的例子,银行转帐是简单能够分为两个步骤字符串
如:帐号A向帐号B转1000元钱。get
一、帐号B+1000元;
二、帐号A-1000元;
这两步是不可分的,假如帐号B+1000元后,执行第二步发现帐号A余额不足时(固然实际开发中会先判断余额,这里是假设),执行失败,那么帐号B就多出了1000元,而帐号A却没减去1000元。
有了事务咱们就能够保证这两步要么所有执行,要么所有不执行。
伪代码:
begin 事务
update 帐号表 set money=money+1000 where 帐号=帐号B;
update 帐号表 set money=money-1000 where 帐号=帐号A;
if 程序报错
rollback 事务;
else
commit 事务;
--------------------------------------------------------------------------------------------------------------------------------
sql代码
1 create table tbl_test( 2 id nvarchar(10), 3 name nvarchar(5) 4 ); 5 insert into tbl_test values('001','名字1'); 6 update tbl_test set name='名字2' where id='001'
7 update tbl_test set name='名字超过5字' where id='001' --这句话会报错 将截断字符串或二进制数据。
上面的代码最后执行完,会将名字1改成名字2
加上事务
1 begin transaction
2 update tbl_test set name='名字2' where id='001'; 3 update tbl_test set name='名字超过5字' where id='001'; 4 if @@error <> 0
5 begin
6 rollback transaction
7 end
8 else
9 begin
10 commit transaction
11 end
执行结果name字段的值仍是名字1,第二句update执行失败了以后,第一句update也没有执行。
另外一种写法:T-sql是有异常机制的
1 begin try 2 begin transaction
3 update tbl_test set name='名字2' where id='001'; 4 update tbl_test set name='名字超过5字' where id='001'; 5 commit transaction
6 end try 7 begin catch 8 --select ERROR_NUMBER() as 错误代码
9 rollback transaction
10 end catch