事务处理:
1)开始事务(begin transaction)
2)提交事务(commit transaction)
3)回滚事务(rollback transaction)
4)事务保存点(save transaction savepoint_name、rollback transaction savepoint_name、set implicit_transactions on/set implicit_transactions off)
并发控制(封锁/死锁):
封锁是并发控制的主要技术。其基本思想是:当需要查询或更新数据时,先对数据进行封锁,以避免来自其他事务的干扰。数据库管理系统一般提供三种封锁机制,即共享封锁、独占封锁和更新封锁。封锁的对象既可以使关系,也可以是元祖。1)共享封锁(S封锁)是为读操作设置的一种封锁,所以也称读封锁,在读数据的过程中,不允许其他用户对该数据进行任何修改操作。2)独占封锁(X封锁)是为修改操作设置的一种封锁,也称为写封锁,这是最严格的一类封锁。在需要对表进行插入、删除或更新操作时,应该使用独占封锁。3)在不插入或删除的情况下,当需要对一个记录或一组记录进行更新时使用更新封锁,该封锁的目的是防止其他用户在同一时刻修改同一记录。有些封锁在执行完相应操作后就自动释放封锁,有些封锁则保持到事务结束时才释放。
SQL Server的封锁操作通过WITH子句完成,该短语可以在select、insert、update和delete等语句中制定锁定的方式和范围。
如:select * from customers with(tablock holdlock)
tablock:表示共享封锁,在读完数据后立刻释放封锁。
holdlock:与tablock一起使用,可将共享锁保留到事务完成,而不是在读完数据后立即释放锁。
nolock:不进行封锁,此关键词仅应用于select语句。
tablockx:对表进行独占封锁。
updlock:对表中的制定元祖实施更新封锁,实施更新封锁后其他事务可以对同一表中的元祖也实施更新封锁,但是不允许对表进行共享封锁和独占封锁。
为了提高并发性能,数据库管理系统还支持一种意向锁(Intension Lock)的机制。
意向锁:
1)意向共享(IS)
2)意向排他(IX)
3)共享意向排他(SIX)。
为避免干扰而使用封锁,但是如果封锁不当,则会出现死锁问题。如两个事务A和B,为完成某个事务都需要封锁客户和产品两个关系,这两个事务正好按照交错序列执行,结果两个程序都因为等待对方释放资源而产生死锁。
为避免死锁,通常采取两种方法:
1)相同顺序法:所有的用户程序约定都按相同的顺序来封锁表。
2)一次封锁法:为了完成一个事务,一次性封锁所需要的全部表。