SQL Server2005 事务隔离级别
任何事务无论其隔离级别如何,都具有原子性。原子性和隔离级别是两码事。
假定只有一种资源数据表上的“行“可以被锁定。锁只有共享锁和排他锁两种。
锁的兼容性:
SX
S 10
X 00
事务的隔离级别:
Read Uncommitted
数据读取时不需要锁定
Read Committed
数据读取时需要共享锁定
Repeatable Read
数据读取时需要排他锁
Serializable
事务必须等同于串行执行
注意无论任何时候更新行都必须要有排他锁。
插入行不需要锁。
在Read Committed隔离级别下,数据读取完毕后立即释放共享锁,而在Repeatable Read隔离级别下,事务保持共享
锁直到整个事务结束。
在SQL Server中调整事务隔离级别是针对会话的,set tran isolation level后,会话中后来开始的事务都在此隔
离级别上执行。一个事务只能具有一个隔离级别。同一会话中的所有事务必须串行执行。必须通过begin tran语句来覆盖默认事务范围。
测试:
/*环境*/
CREATE TABLE [dbo].[TranTest](
[Id] [int] IDENTITY(1,1) NOT NULL,
[count1] [int] NULL,
[count2] [int] NULL
)
insert into TranTest values(1,2)
insert into TranTest values(3,4)
insert into TranTest values(5,6)
insert into TranTest values(7,8)
约定总是先执行session1,并且在session1结束前执行session2
1. 排他锁总是在事务结束时释放
--session 1
set tran isolation level any
begin tran
update TranTest set count1=count1 + 10 where id=1
waitfor delay '00:00:10'
commit tran
--session 2
select * from TranTest
现象:session2被阻塞直到session1中的会话结束。
解释:session1首先执行,更新id=1的行时持有了该行的排他锁,该锁直到session1中的事务结束时释放,这阻止
了session2获得共享锁。
2. 读未提交无需任何锁
--session 1
set tran isolation level any
begin tran
update TranTest set count1=count1 + 10 where id=1
waitfor delay '00:00:10'
commit tran
--session 2
set tran isolation level read uncommitted
begin tran
select * from TranTest
commit tran
现象:session2未被阻塞,而是读取到了session1尚未提交的数据。
解释:读未提交无需锁定,因而绕开了锁定机制。
3. 死锁
--session 1
set tran isolation level read committed
begin tr
相关文档:
内容转自:http://blog.csdn.net/lfzwenzhu/archive/2008/03/06/2153473.aspx
SELECT CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
SELECT CONVERT(varchar(100), GETDATE(), 1): 05/16/06
SELECT CONVERT(varchar(100), GETDATE(), 2): 06.05.16
SELECT CONVERT(varchar(100), GETDATE(), 3): 16/05/06
......
一般使用SQL Server的集成认证时,都需要登陆进域,下面介绍一种不需要登陆域就可以使用域用户登陆SQL Server的方法。
SQL Server Management Studio 2005和2008的快捷方式如下图:
SQL Server 2008 x64: "C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe"
SQL ......
Sql Server 中一个非常强大的日期格式化函数
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
Select CONVERT(varchar(100), GE ......
清空日志
1.打开查询分析器,输入命令
DUMP TRANSACTION 数据库名 WITH NO_LOG
2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了。
......