MS SQL 事务隔离级别
自己在网上看了些资料,整理一下:
事务隔离级别分类:
未提交读:在多个事务之间使用它将会是非常危险,一般不使用。
已提交读:一个事务读取的数据在事务运行期间可能被另一个事务更改,两次读的数据可能不一样。
可重复读:会阻止现有的数据被更改,但不会阻止新数据插入到SELECT语句的结果集中。
可序列化:比可重复读级别更严格,不仅会锁定事务所读取的数据,还会锁定事务的读取范围,锁定范围的叫做范围锁,
它会锁定SELECT的WHERE的范围,范围锁在关联索引存在的时候使用,如果没有关联索引,则使用表级锁。
行版本控制来读取数据的事务级别:
已提交读快照: 用于减少阻塞,注意这是一个数据库选项。
快照:用于一致性读操作,忽略了事务运行过程中数据的更改。
处理阻塞应该遵守以下规则:
l 事务要尽量短
l 不要在事务之中请求用户输入
l 在读数据的时候考虑使用行版本管理
l 在事务中尽量访问最少量的数据。
l 尽可能地使用低的事务隔离级别。
几个常用阻塞诊断SQL语句:
Code
为了防止并处理死锁,应该遵守以下原则:
l 遵守最少化阻塞的规则。阻塞越少,发生死锁的机会就越少。
l 在事务中要按一致的顺序访问对象。如果在以上示例中的两个事务都按一个顺序访问表,就不会发生死锁。因此,要在数据库中定义对所有表的访问顺序。
l 在错误处理程序中检查错误1205并在错误发生时重新提交事务。
l 在错误处理程序中加入一个过程将错误的详细信息写入日志。