SQL Native Client:
SQL Native Client是SQL Server 2008自带的一种数据访问方法,由OLE DB和ODBC用于访问SQL Server。它通过将OLE DB和ODBC库组合成一种访问方法,简化了对SQL Server的访问。这种访问类型展示了SQL Server的一些新功能。
l 数据库镜像
l 多活动记录集(Multiple Active Recordset,MARS)
l 快照隔离
l 查询通知
l XML数据类型支持
l 用户定义的数据类型(User-defined data type,UDT)
l 加密
l 执行异步操作
l 使用大型值类型
l 执行批量复制操作
l 表值参数
l 大型CLR用户定义类型
l 密码过期
可以在其他数据层(如Microsoft Data Access Component,MDAC)中使用这些新功能中的一部分,但需要做更多的工作。MDAC仍然存在,如果不需要SQL Server 2005\2008的一些新功能,则可以使用MDAC。如果开发基于COM的应用程序,那么应使用SQL Native Client;如果开发托管代码应用程序(如用C#),那么应考虑使用SQL Server .NET Framework数据提供程序(它非常健壮且包括SQL Server 2005\2008的功能)。
SSIS中的事物类型:
SSIS中的包,容器(例如Loop,Foreach Loop,Sequence)或者一个单独的任务中都可以设置事务处理选项。事务处理选项有下面一些值
- Required-如有事务则添加,否则新添加一个
- Supported-如有有事务添加一个,没有则不添加,这是默认选项+
- NotSupported-不添加事务处理
内建的事务处理要使用DistributedTransaction Coordinator(MSDTC)服务,这个服务必须开启。MSDTC允许使用分布式事务处理,例如在一个事务中同时处理SQL Server数据库和Oracle数据库。如果没有开启这个服务会得到下面的错误提示。
如果整个包需要进入事物管理范围内:那么需要设置包得事物级别为Required,控制流对象全部为Supported
SSIS中的事物隔离机制:
READ UNCOMMITTED
指定语句可以读取已由其他事务修改但尚未提交的行。
在 READ UNCOMMITTED 级别运行的事务,不会发出共享锁来防止其他事务修改当前事务读取的数据。READ UNCOMMITTED 事务也不会被排他锁阻塞,排他锁会禁止当前事务读取其他事务已修改但尚未提交的行。设置此选项之后,可以读取未提交的修改,这种读取称为脏读。在事务结束之前,可以更改数据中的值,行也可以出现在数据集中或从数据集中消失。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 NOLOCK 相同。这是隔离级别中限制最少的级别。
在 SQL Server 2005 中,您还可以使用下列任意一种方法,在保护事务不脏读未提交的数据修改的同时尽量减少锁定争用:
1. READCOMMITTED 隔离级别,并将 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON。
2. SNAPSHOT 隔离级别。
READ COMMITTED
指定语句不能读取已由其他事务修改但尚未提交的数据。这样可以避免脏读。其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻像数据。该选项是 SQL Server 的默认设置。
READ COMMITTED 的行为取决于READ_COMMITTED_SNAPSHOT 数据库选项的设置:
1. 如果将READ_COMMITTED_SNAPSHOT 设置为 OFF(默认设置),则数据库引擎会使用共享锁防止其他事务在当前事务执行读取操作期间修改行。共享锁还会阻止语句在其他事务完成之前读取由这些事务修改的行。语句完成后便会释放共享锁。
2. 如果将READ_COMMITTED_SNAPSHOT 设置为 ON,则数据库引擎会使用行版本控制为每个语句提供一个在事务上一致的数据快照,因为该数据在语句开始时就存在。不使用锁来防止其他事务更新数据。
当READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON 时,您可以使用 READCOMMITTEDLOCK 表提示为 READ_COMMITTED 隔离级别上运行的事务中的各语句请求共享锁,而不是行版本控制。
注意:设置READ_COMMITTED_SNAPSHOT 选项时,数据库中仅允许存在执行 ALTER DATABASE 命令的连接。在 ALTER DATABASE 完成之前,数据库中不允许有其他打开的连接。数据库不必处于单用户模式。
SERIALIZABLE
请指定下列内容:
1. 语句不能读取已由其他事务修改但尚未提交的数据。
2. 任何其他事务都不能在当前事务完成之前修改由当前事务读取的数据。
3. 在当前事务完成之前,其他事务不能使用当前事务中任何语句读取的键值插入新行。
范 围锁处于与事务中执行的每个语句的搜索条件相匹配的键值范围之内。这样可以阻止其他事务更新或插入任何行,从而限定当前事务所执行的任何语句。这意味着如果再次执行事务中的任何语句,则这些语句便会读取同一组行。在事务完成之前将一直保持范围锁。这是限制最多的隔离级别,因为它锁定了键的整个范围,并在事务完成之前一直保持范围锁。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
需要注意的地方:
1. 一次只能设置一个隔离级别选项,而且设置的选项将一直对那个连接始终有效,直到显式更改该选项为止。事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的 FROM 子句中的表提示为表指定了其他锁定行为或版本控制行为。
2. 事务隔离级别定义了可为读取操作获取的锁类型。针对 READ COMMITTED 或 REPEATABLE READ 获取的共享锁通常为行锁,尽管当读取引用了页或表中大量的行时,行锁可以升级为页锁或表锁。如果某行在被读取之后由事务进行了修改,则该事务会获取一个用于保护该行的排他锁,并且该排他锁在事务完成之前将一直保持。例如,如果 REPEATABLE READ 事务具有用于某行的共享锁,并且该事务随后修改了该行,则共享行锁便会转换为排他行锁。
3. 在事务进行期间,可以随时将事务从一个隔离级别切换到另一个隔离级别,但有一种情况例外。即在从任一隔离级别更改到 SNAPSHOT 隔离时,不能进行上述操作。否则会导致事务失败并回滚。但是,可以将在 SNAPSHOT 隔离中启动的事务更改为任何其他隔离级别。
4. 将事务从一个隔离级别更改为另一个隔离级别之后,便会根据新级别的规则对更改后读取的资源执行保护。在更改前读取的资源将继续按照以前级别的规则受到保护。例如,如果某个事务从 READ COMMITTED 更改为 SERIALIZABLE,则在该事务结束前,更改后所获取的共享锁将一直处于保留状态。
5. 如果在存储过程或触发器中发出 SET TRANSACTION ISOLATION LEVEL,则当对象返回控制时,隔离级别会重设为在调用对象时有效的级别。例如,如果在批处理中设置 REPEATABLE READ,并且该批处理调用一个将隔离级别设置为 SERIALIZABLE 的存储过程,则当该存储过程将控制返回给该批处理时,隔离级别就会恢复为 REPEATABLE READ。