HI ALL,
大家好,现在遇到了一点小疑惑。之前的SQLServer开发知识中讲到单条Update语句在SQLServer中按照隐式事务来处理的。我现在遇到这样一个问题,C#开发的多线程客户端联入SQLServer2005数据库,执行一个表的update 语句,Update的是单条记录。就是
update table set field=1 where 唯一ID=1这个样子。
在测试程序中,启动30个线程实例做系统压力测试,每个线程循环更新1000次表中的某一条记录,更新内容为一数值列+1操作。这时sp_lock观察数据库中的在线程执行过程中会产生大约20到30个锁的信息,锁的类型有Key、PAG、TAB。在全部测试线程执行结束后,锁会被自动释放掉。
如果在update语句中显式的写入Begin tran commit rollback tran后,通过sp_lock观察不到锁的信息。
请问,前一种情况是否可以判断为锁表,后一种则没有锁表。另外,隐式与显式事务的区别有这么大吗?期望专家指教!
问这个问题是由于在测试过程中发现了有锁导致系统异常的状况产生。
谢谢各位。
------解决方案--------------------
显式事务
显式事务可以显式地在其中定义事务的启动和结束。在 Microsoft® SQL Server? 的早期版本中,显式事务也称为用户定义或用户指定的事务。
DB-Library 应用程序和 Transact-SQL 脚本使用 BEGIN TRANSACTION、COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION 或 ROLLBACK WORK Transact-SQL 语句定义显式事务。
BEGIN TRANSACTION
为连接标记显式事务的起始点。
COMMIT TRANSACTION 或 COMMIT WORK
如果没有遇到错误,可使用该语句成功地结束事务。该事务中的所有数据修改在数据库中都将永久有效。事务占用的资源将被释放。
ROLLBACK TRANSACTION 或 ROLLBACK WORK
用来清除遇到错误的事务。该事务修改的所有数据都返回到事务开始时的状态。事务占用的资源将被释放。
还可以在 OLE DB 中使用显式事务。调用 ITransactionLocal::StartTransaction 方法可启动事务。将 fRetaining 设置为 FALSE,则调用 ITransaction::Commit 或 ITransaction::Abort 方法结束事务时,不会自动启动另一事务。
在 ADO 中,对 Connection 对象使用 BeginTrans 方法可启动隐性事务。若要结束该事务,可调用该 Connection 对象的 CommitTrans 或 RollbackTrans 方法。
ODBC API 不支持显式事务,只支持自动提交和隐性事务。
显式事务模式持续的时间只限于该事务的持续期。当事务结束时,连接将返回到启动显式事务前所处的事务模式,或者是隐性模式,或者是自动提交模式。
------解决方案--------------------
隐式事务又称自动提交事务,就这么点区别,说多点就是下面这一大段
事务是SQL Server防止你的数据出现不一致状态的基础结构.我们已经学习过事务是如
何工作的.在这一节中,我们将学习在SQL Server开发环境下如何让事务为你工作.S Q L
S e r v e r中事务有两种,它们是隐式事务和显式事物.
21.3.1 隐式事务
隐式事务是SQL Server为你而做的事务.隐式事务又称自动提交事务.如果运行一条
I N S E RT语句,SQL Server将把它包装到事务中,如果此I N S E RT语句失败,SQL Server将回滚
或取消这个事务.每条S Q L语句均被视为一个自身的事务.例如在程序清单2 1 - 2中,有四条
I N S E RT语句.第一,二,四条是有效的,第三条语句是无效的.因为它违反了该表中有关作
者标识必须唯一的约束.当程序运行时,第一,二,四条语句执行成功并插入表中.第三条
第2 1学时SQL Serv e r编程2 0 5
下载
语句失败并回滚.
程序清单21-2 隐式事务
在日常操作中,你可能依赖于隐式事务.在第三方应用程序中,这些应用程序的开发人
员则可能使用显式事务.
21.3.2 显式事务
显示事务是一种由你自己指定的事务.这种事务允许你自己决定哪批工作必须成功完成,
否则所有部分都不完成.为了给自己的事务定界,可以使用关键字BEGIN TRANSACTION和
ROLLBACK TRANSACTION或COMMIT TRANSACTION.
BEGIN TRANSACTION—这个关键词用来通知SQL Server一个事务就要开始了.
BEGIN TRANSACTION后面发生的每一条S Q L语句都是同一个事务中的一部分.
ROLLBACK TRANSACTION—这个关键词用来通知SQL Server自BEGIN TRANSACTION
后的所有工作都应取消,对数据库中任何数据的改变都被还原,任何已经创建或删除的对
象被清除或恢复.
COMMIT TRANSACTION—这个关键词用来通知SQL Server自BEGIN TRANSACTION
后的全部工作都要完成并成为数据库的一个永久性部分.在同一个事务中,你不能同时
使用ROLLBACK TRANSACTION和COMMIT TRANSACTION.
你必须意识到,即使你的脚本中有错误,而你又让SQL Server提交事务,该事务也将执
行.如果你打算依赖于现实事务保证数据完整性,必须在脚本中建立错误检查机制.程序清
单2 1 - 3中的代码显示了运用显式事务来回滚对e m p l o y e e s表的改动.
------解决方案--------------------
学习。
------解决方案--------------------
只搜到了这2个,一个是联机丛书的,一个是别人的解释,希望对你有帮助
关注此话题,等待高手。
------解决方案--------------------
事务的隔离等级
语法:
SET TRANSACTION ISOLATION LEVEL
{READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
1. READ UNCOMMITTED:完全没有隔离效果,读取到的数据随时都可能被别人更改事删除。
2. READ COMMITTED:不允许读取尚未COMMIT的数据。因为该数据被改动的几率很大。不过,在读取完数据后就和READ UNCOMMITTED一样,不会在乎该数据是否还会被别人更改。因此每次读取到的数据可能会不相同。
3. REPEATABLE READ:事务中所读取到的数据,将不允许别人更改或删除,以保证在事务中每次都可以读取到相同的内容。但别人仍然可以在该数据表中新增记录。
4. SERIALIZABLE:数据表全部锁定,不允许别人来修改、删除或新增数据。由于必须等到事务完成后,其他事务才能使用这些数据表,因此Serializable的并发性最低,要使用相同数据的事务必须一个个顺序地进行。