日期:2014-05-16 浏览次数:20492 次
--9.1 事务 --显示事务的定义需要以BEGIN TRAN语句作为开始.如果想提交事务,则应该以COMMIT TRAN语句显式结束事务; --如果不想提交事务(撤销事务中的修改),则应该以ROLLBACK TRAN语句显式结束事务。 begin tran; use tempdb; go insert 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 tran update Production.Products set unitprice=unitprice+1.00 where productid=2; --Connection 2: select productid, unitprice from Production.Products where productid=2;