含义
事务要有非常明确的开始和结束点SQL Server 中的每一条数据操作语句例如SELECTINSERTUPDATE和DELETE都是隐式事务的一部分即使只有一条语句系统也会把这条语句当做一个事务要么执行所有的语句要么什么都不执行
事务开始之后事务所有的操作都会写到事务日志中写到日志中的事务一般有两种一是针对数据的操作例如插入修改和删除这些操作的对象是大量的数据;另一种是针对任务的操作例如创建索引当取消这些事务操作时系统自动执行这些操作的反操作保证系统的一致性系统自动生成一个检查点机制这个检查点周期的检查事务日志如果在事务日志中事务全部完成那么检查点事务日志中的事务提交到数据库中并且在事务日志中做一个检查点提交标识;如果在事务日志中事务没有完成那么检查点不会将事务日志中的事务提交到数据库中并且在事务日志中做一个检查点未提交的标识事务的恢复及检查点保证了系统的完整和可恢复
事务的属性
事务是作为单个逻辑工作单元执行的一系列操作一个逻辑工作单元必须有个属性称为原子性(Atomic) 一致性(Consistent)隔离性(Isolated)持久性(Durable)简称ACID属性只有这样才能构成一个事务
原子性:
整个事务中的所有操作要么全部完成要么全部不完成不可能停滞在中间某个环节事务在执行过程中发生错误会被回滚(Rollback)到事务开始前的状态就像这个事务从来没有执行过一样
一致性:
在事务开始之前和事务结束以后数据库的完整性约束没有被破坏
隔离性:
两个事务的执行是互不干扰的一个事务不可能看到其他事务运行时中间某一时刻的数据
持久性:
在事务完成以后该事务所对数据库所作的更改便持久的保存在数据库之中并不会被回滚
由于一项操作通常会包含许多子操作而这些子操作可能会因为硬件的损坏或其他因素产生问题要正确实现ACID并不容易ACID建议数据库将所有需要更新 以及修改的资料一次操作完毕但实际上并不可行
事务管理的常用语句
BEGIN TRANSACTION——建立一个事务
COMMITTRANSACTION——提交事务
ROLLBACK TRANSACTION——事务失败时执行回滚操作
SAVE TRANSACTION——保存事务
BEGIN TRANSACTION 和COMMIT TRANSACTION同时使用用来表示事务的开始和结束
事务的隔离级别
事务具有隔离性不同事务中所使用的时间必须要和其他事务进行隔离在同一时间可以有很多个事务正在处理数据但是每个数据在同一时刻只能有一个事务进行操作如果将数据锁定使用数据的事务就必须要排队等待这样可以防止多个事务互相影响但是如果有几个事务因为锁定了自己的数据同时又在等待其他事务释放数据则造成死锁
为了提高数据的并发使用效率可以为事务在读取数据时设置隔离状态SQL Server 中的事务隔离状态由低到高分为个级别
未授权读取
也称为读未提交(Read Uncommitted)允许髒读取但不允许更新丢失如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据该隔离级别可以通过“排他写锁”实现
授权读取
也称为读提交(Read Committed)允许不可重复读取但不允许髒读取这可以通过“瞬间共享读锁”和“排他写锁”实现读取数据的事务允许其他事务继续访问该行数据但是未提交的写事务将会禁止其他事务访问该行
可重复读取
可重复读取(Repeatable Read)禁止不可重复读取和髒读取但是有时可能出现幻影数据这可以通过“共享读锁”和“排他写锁”实现读取数据的事务将会禁止写事务(但允许读事务)写事务则禁止任何其他事务
序列化
序列化(Serializable)提供严格的事务隔离它要求事务序列化执行事务只能一个接着一个地执行但不能并发执行如果仅仅通过“行级锁”是无法实现事务序列化的必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到