sqlserver事务隔离
事务是一个工作单元,可能包含查询和修改数据以及修改数据定义等多个活动。我们可以显式或隐式的定义事务边界。可以使用BEGIN TRAN或者BEGIN TRANSACTION语句显式的定义事务的开始。如果希望提交事务,可以使用COMMIT TRAN语句显式的定义事务结束。如果不希望提交事务(即要撤销更改),可以使用ROLLBACK TRAN或者ROLLBACK TRANSACTION语句-摘抄自SQL Server 2012基础教程。 如果不显式的标记事务的边界,默认情况下,SQL Server将把每个单独语句作为一个事务,换句话说,默认情况下,每个单独语句结束后SQL Server自动提交事务。 说到事务就联想到并发,为了解决事务中的并发我们则不得不讨论下锁,所以接下来我们首先熟悉一下锁的模式-排他锁和共享锁。 先看看下面的试验,先开始一个事务处理,这个事务不提交也不回滚,然后另外在打开一个窗口查询数据。 在上面的事务没有提交也没有回滚的情况下,如果另一个程序在执行查询,那么就会阻塞,如果没有设置查询超时,就会一直等待。 原因:当事务会话对表进行修改(增删改)时,事务会请求数据资源的一个排他锁,这个锁直到事务完成(提交或者回滚)才会被取消。当读取数据时需要获取该资源上的共享锁,但是排他锁和共享锁不能兼容,此时会导致查询阻塞不得不进行等待。 就上面的试验,第一个事务拥有排它锁