第9章 事务和并发(1)
--9.1 事务--显示事务的定义需要以BEGIN TRAN语句作为开始.如果想提交事务,则应该以COMMIT TRAN语句显式结束事务;--如果不想提交事务(撤销事务中的修改),则应该以ROLLBACK TRAN语句显式结束事务。begin tran;use tempdb;goinsert into dbo.t1(keycol, col1, col2) values(4, 101, 'C');insert into dbo.t1(keycol, col1, col2) values(4, 201, 'X');--事务的四个属性:--原子性 事务必须是原子工作单元.这意味着在事务中进行的修改,要么全都执行,要么全都不执行.--一致性 事务的一致性这个术语指的是,同时发生的事务在修改和查询数据时不发生冲突,通过RDBMS访问的数据要保持一致的状态.--隔离性 隔离性是一种用于数据访问的机制,能够确保事务只访问处于期望的一致性级别下的数据.--持久性 再将数据修改写入到磁盘上数据库的数据分区之前,总是先把这些修改写入到磁盘上数据库的事务日志中.use TSQLFundamentals2008;begin tran;declare @neworderid as int;insert into Sales.Orders(custid, empid, orderdate,requireddate, shippeddate, shipperid,freight, shipname, shipaddress, shipcity, shippostalcode, shipcountry)values (85, 5, N'20090212', N'20090216', '20090301', 3, 32.38, N'Ship to 85-B', N'6789 rue de l', N'Abbaye Reims', N'10345', N'France');set @neworderid = SCOPE_IDENTITY()select @neworderid as neworderid;insert into Sales.OrderDetails(orderid, productid, unitprice, qty, discount)values(@neworderid, 11, 14.00, 12, 0.000);insert into Sales.OrderDetails(orderid, productid, unitprice, qty, discount)values(@neworderid, 42, 9.80, 10, 0.000);insert into Sales.OrderDetails(orderid, productid, unitprice, qty, discount)values(@neworderid, 72, 34.80, 5, 0.000);commit tran;--9.2 锁定和阻塞--排他锁名称缘由:因为对于相同的数据资源,如果有其他事务已经获得了该资源的任何类型的锁,就--不能再获得该资源的排他锁;如果有其他事务已经获得了该资源的排他锁,就不能再获得该资源的任何类型的锁.--当试图读取数据时,事务默认会为所依赖的数据资源请求共享锁,读操作一完成,就立即释放资源上的共享锁.这种--锁模式之所以称为共享锁,是因为多个事务可以同时持有同一数据资源上的共享锁.--如果一个事务持有某一数据资源上的锁,而另一事务请求相同资源上的不兼容的锁,则对新锁的请求将被阻塞,发出--请求的事务进入等待状态.在默认情况下,被阻塞的请求会一直等待,直到原来的事务释放相关的锁.--Connection 1:begin tranupdate Production.Productsset unitprice=unitprice+1.00where productid=2;--Connection 2:select productid, unitpricefrom Production.Productswhere productid=2;