具体事务详细解析请参照【人生就是一场与懒惰的拔河!】的文章 里面的内容很细,值得一看!!!
本文只是提取出事务的一些主要特性:
一:事务4大属性:
1)原子性:最小模块,默认每个语句为单独的事务
2)一致性:1)事务对数据完整性约束的遵循 2)同时发生的事务在修改和查询数据时不发生冲突
3)隔离性:实现事务隔离,最常见的是锁
4)持久性:事务成功提交之后没有办法回滚,只有事务异常时才可以回滚
二:事务的锁模式:
(1)排他锁-Insert、update
a.当试图修改数据时,事务只能为所依赖的数据资源请求排他锁。
b.持有排他锁时间:一旦某个事务得到了排他锁,则这个事务将一直持有排他锁直到事务完成。
c.排他锁和其他任何类型的锁在多事务中不能在同一阶段作用于同一个资源。
如:当前事务获得了某个资源的排他锁,则其他事务不能获得该资源的任何其他类型的锁。其他事务获得了某个资源的任何其他类型的锁,则当前事务不能获得该资源的排他锁。
(2)共享锁-select
a.当试图读取数据时,事务默认会为所依赖的数据资源请求共享锁。
b.持有共享锁时间:从事务得到共享锁到读操作完成。
c.多个事务可以在同一阶段用共享锁作用于同一数据资源。
d.在读取数据时,可以对如何处理锁定进行控制。。
程序员理解的锁:
悲观锁:一切sql语句都会出现更新丢失的情况
使用隔离级别和排他锁进行控制
乐观锁:一切sql语句都不会出现更新丢失的情况
三:T-SQL中管理事务的语句:
1 开始事务: begin transaction
2 提交事务:commit transaction
3 回滚事务: rollback transaction
注:
1)事务在处理中遇到错误,SQL Server通常会自动回滚事务;
2)少数不太严重的错误不会引发事务的自动回滚,如主键冲突、锁超时等;
3)可以使用错误处理来捕获第4点提到的错误,并采取某种操作,如把错误记录在日志中,再回滚事务;
四:注意事项
1:使用事务最好遵循事务的原子性。如果需要处理业务超级麻烦的数据,按理说使用一个事务也是可以的,但是事务如果在未提交commit transaction前占用时间过长,容易造成锁的形成。
2:事务的一致性和隔离性 具有一定的互斥性。针对于大批量并发可能主要设置隔离性。