SQL Server 2008编程入门经典笔记:事务

事务

1、BEGIN TRAN
开始事务

2、COMMIT TRAN
提交事务

3、ROLLBACK TRAN
回滚事务

4、SAVE TRAN(不推荐初学者使用)
保存要回滚的点。

SQL Server 日志的工作方式

数据存入数据库前,先存入缓存,在存入日志,最后存入数据库。
在书中的5中情况下会发出检查点,判断是否恢复。
1、失败和恢复

2、隐式事务(危险的)

锁和并发

并发是指同一时间多用户执行同样交互的操作。
锁可以使相同操作的多个用户,后来的进行等待。
1、通过锁可以防止的问题
1)脏读
一个事务读取的是另一个未完成事务的值。
解决方法:事务隔离级别(READ COMMITTED)。
2)非重复性读取
一个事务两次读取值,而另一个事务该变了值。
解决方法:
CHECK约束。
将隔离级别设置为REPEATABLE READ或SERIALIZABLE。
3)幻读
一些数据在进行修改的时候,刚好执行了插入操作,导致一些数据没被修改。
解决方法:设置隔离级别为:SERIALIZABLE
4)丢失更新
一个更新成功写入数据库后,而又意外的被另一个事务重写了。

2、可以锁定的资源
资源包括:数据库、表、区段、页、键、行或行标识符

3、锁升级和锁对性能的影响
当锁数量达到一定的限度时,则会升级为下一个更高的层次。

4、锁定模式
1)共享锁
共享锁可以防止用户执行脏读。
2)排他锁
可以防止两个人同时更新、删除或执行任何操作。
3)更新锁
共享锁+排他锁
4)意向锁
3种类型:意向共享锁、意向排他锁、共享意向排他锁。
5)模式锁
模式修改锁:不能执行查询、CREATE、ALTER、DROP操作
模式稳定性锁定:类似共享锁。
6)批量更新锁
执行任何普通操作都会将表锁定。

5、锁的兼容性
见书389

6、指定一种特有的锁定类型——优化器提示(高级)
1)使用Management Studio确定锁

设置隔离级别

1)READ COMMITTED
可以防止脏读。
2)READ UNCOMMITTED(最危险)
取消所有的锁。
3)REPEATABLE READ
可以防止脏读和非重复性读取。
4)SERIALIZABLE
可以防止所有。
5)SNAPSHOT
类似READ COMMITTED和READ UNCOMMITTED。
只有数据库打开了ALLOW_SNAPSHOT_ISOLATION选项时才可以使用。

处理死锁(1205错误)

1、SQL Server 判断死锁的方式
每隔5秒进行检查

2、选择死锁的牺牲者的方式
选择回滚代价最低的事务。

3、避免死锁
1)按相同的顺序使用对象。
2)使事务尽可能简短。
3)尽可能使用最低的事务隔离级别。
4)不要采用允许无限中断的事务。

你可能感兴趣的:(SQLServer)