事务作为单个逻辑工作单元执行一系列的操作,一个逻辑工作单元必须具有四个属性:原子性,一致性,隔离性,持久性,只有同时满足这四个特性,才能成为一个事务。
一,事务的四个属性
原子性:事务是原子工作单元,对于数据修改,要么全部执行,要么全部不执行。
一致性:事务在完成时,必须保证数据对象的所有状态都保持一致,事务结束时,所有的内部数据结构(索引,索引视图等)都必须是正确的。
隔离性:由并发事务所做的修改必须与其他任何并发事务所做的修改隔离。
持久性:事务完成之后,对数据的修改是永久性的。
二,事务的两种类型
1,隐式事务,每一条Sql 语句都是一条事务,这条语句要么成功,要么失败。
2,显式事务,由begin tran开启的事务,但是显式事务中任何一条语句失败,sql server并不都回滚,需要设置数据库选项
SET XACT_ABORT { ON | OFF } ,OFF 是默认设置。
当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。
3,分布式事务,跨越多个服务器的事务称为分布式事务,使用 begin distributed transaction 命令启动一个分布式事务
三,数据库引擎提供一种机制,保证事务的特性。
1,事务的管理特性,保证事务的原子性和一致性
事务启动之后,必须成功完成,否则,数据库引擎将撤销该事务启动之后对数据所做的所有修改
2,先写入日志方式,保证事务的持久性
sql server通过先写入日志,后写入数据的机制来保证事务的持久性。如果在写入日志时,出现故障,那么sql server将不会对数据做修改;如果日志写入成功,在写数据时出现故障,那么sql server将所有未完成的事务自动回滚到系统出现故障的点,保持数据的持久性。
3,使用锁来加锁资源,使事务保持隔离
sql server 通过在访问不同资源时,申请不同类型的锁的方式,实现不同事务之间的隔离。如果两个事务同时申请一个资源,那么在其中一个事务申请到锁之后,另外一个事务必须等待,直到前一个事务释放锁为止。
锁是实现事务隔离的一部分,阻塞是实现事务隔离所带来的不可避免的代价。
三,锁和事务的隔离性
隔离性是事务的一个特性,sql server 使用锁来保证事务的隔离性。