日期:2014-05-16  浏览次数:20500 次

第9章 事务和并发(1)
--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;