![数据库应用技术第十三章2007-8_第1页](http://file4.renrendoc.com/view/cba2af2fc69fd6681d50b7e377e81203/cba2af2fc69fd6681d50b7e377e812031.gif)
![数据库应用技术第十三章2007-8_第2页](http://file4.renrendoc.com/view/cba2af2fc69fd6681d50b7e377e81203/cba2af2fc69fd6681d50b7e377e812032.gif)
![数据库应用技术第十三章2007-8_第3页](http://file4.renrendoc.com/view/cba2af2fc69fd6681d50b7e377e81203/cba2af2fc69fd6681d50b7e377e812033.gif)
![数据库应用技术第十三章2007-8_第4页](http://file4.renrendoc.com/view/cba2af2fc69fd6681d50b7e377e81203/cba2af2fc69fd6681d50b7e377e812034.gif)
![数据库应用技术第十三章2007-8_第5页](http://file4.renrendoc.com/view/cba2af2fc69fd6681d50b7e377e81203/cba2af2fc69fd6681d50b7e377e812035.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第13章 事 务 13.1 事务操作 13.2 事务的编程 13.3 锁和死锁 13.4 分布式事务 2022/8/81天津大学计算机基础教学部 13.1 事务操作一、事务的定义和属性 事务可以被定义成一系列操作,这些操作作为单个逻辑工作单元共同完成。 事务具有ACID属性,即Atomic原子性,Consistent一致性,Isolated隔离性,Durable永久性。1. 原子性 要么完成所有数据的修改,要么对这些数据不做任何修改2. 一致性 在成功地完成一个事务后,所有的数据都处于一致状态。3. 独立性 事务独立于同时发生的其它事务对数据的修改。4. 持久性 完整的事务对数据的任何修改都
2、能在系统中永久保存下来。2022/8/82天津大学计算机基础教学部二、事务并发及并发产生的问题 SQL Server提供乐观和悲观的两种并发控制。当许多人试图同时修改数据库内的数据时,必须执行控制系统以使某个人所做的修改不会对他人产生负面影响,这称为并发控制.乐观并行 允许事务在不锁定任何资源的情况下执行。只有当事务要提交时才检查资源,以确定是否有冲突发生。乐观并发是由游标来实现的。悲观并行在事务执行期间锁定资源。除非发生死锁,事务总能得以成功执行。悲观并发是缺省的。2022/8/83天津大学计算机基础教学部并发问题包括以下几个:1. 丢失更新 当两个或多个事务选择同一行,然后基于最初选定的值
3、更新该行时,每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。2. 未确认的相关性(脏读)当第二个事务选择其它事务正在更新的行时,第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。 3. 不一致的分析(不可重复读)当第二个事务多次访问同一行而且每次读取不同的数据时,其它事务也正在更改第二个事务正在读取的数据。在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被不可重复读取。4. 幻像读 当对某行执行插入或删除操作,事务第一次读的行范围
4、显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。 2022/8/84天津大学计算机基础教学部三、事务操作指南 下面给出一些有关事务的指南:(1)事务以BEGIN TRANSACTION语句为开始, SQL分析器启动事务。(2)当遇到第一个INSERT、SELECT、 UPDATE或DELETE语句时, SQL Server会分配一个新的事务ID并在内存中创建一个日志记录。(3)任何更进一步的记录更改都会创建一个新的日志记录。 所有更改 过的行都记录在日志中,然后内存中的数据页也发生更改。(4
5、)当SQL Server遇到COMMIT TRANSACTION语句时,该日志记 录会写入数据库事务日志。这样就确保即使是在断电或系统崩溃的 情况下,所有事务都可恢复。(5)一旦编写完事务日志,所做的更改将自动应用到数据库。(6)事务编程要尽可能短,在某些T-SQL语句可以使用警告,还要避免 使用需用户交互的事务。(7)不能包含的语句有ALTER DATABASE、BACKUP LOG、 CREATE DATABASE、DROP DATABASE、RECONFIGURE、 RESTORE DATABASE、RESTORE LOG和UPDATE STATISTICS 等。 2022/8/85天津
6、大学计算机基础教学部四、事务处理的类型显式事务 每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。显式事务模式持续的时间只限于该事务的持续期。当事务结束时,连接将返回到启动显式事务前所处的事务模式,或者是隐性模式,或者是自动提交模式自动提交事务 这是 SQL Server 的默认模式。 每个单独的 T-SQL 语句都在其完成后提交。不必指定任何语句控制事务。每个T-SQL 语句在完成时,都被提交或回滚。如果一个语句成功地完成,则提交该语句;如果遇到错误,则回滚该语句。只要自动提交模式没有被显式或隐性事务替代,SQL Serve
7、r 连接就以该默认模式进行操作。自动提交模式也是 ADO、OLE DB、ODBC 和 DB-Library 的默认模式。3. 隐性事务 在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK 语句显式完成。 2022/8/86天津大学计算机基础教学部注意,一旦开启隐式事务,SQL Server将在发现以下关键字的时候启动事务:ALTER TABLE FETCH REVOKE CREATE GRANT SELECT DELETE INSERT TRUNCATE TABLE DROP OPEN UPDATE2022/8/87天津大学计算机基础教学部五、事务的隔离级别
8、隔离属性为事务四大属性之一,是用来保护事务以避免受到其它并行事务执行更新的影响,隔离等级事实上可以针对每个事务来自定义。 SQL Server 支持下列四种隔离级别:1. 未提交读(READ UNCOMMITTED) 事务隔离的最低级别,仅可保证不读取物理损坏的数据。执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。 此种隔离等级是不会发出共享锁定,也不允许独占锁定。当设置为此种隔离选项时,所读取到的数据可能会被别人更改或删除。此种隔离等级与在事务的所有SELEC
9、T语句中将所有表设置为NOLOCK是具有相同的效果,是属于四个隔离等级中限制最少的。 2022/8/88天津大学计算机基础教学部2. 提交读(READ COMMITTED) SQL Server 默认级别。指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。 此种隔离选项是SQL Server的默认隔离选项位。此种隔离选项是不允许读取尚未COMMIT的数据, 因为此种读数据被其他人更改的机率很大。当它在读取充数据后就和READ UNCOMMITTED隔离等级就一样了,并不会在乎该数据是否还会被别人更改,因此每次所读取到的数据可能会不相同。当它在指定数
10、据读取时,会使用共享锁定, 以避免#sql:dirty_read不当读取,但是这些数据可以在事务结束前更新, 因此造成了#sql:nonrepeatable_read无法重复读取或#sql:phantom幽灵数据。 3. 可重复读(REPEATABLE READ) 锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。 2022/8/89天津大学计算机基础教学部4. 可串行读(SERIALIZABLE) 事务隔离的最高级别,事务之间完全隔离。此种隔离会将要使用的表全部锁
11、定,不允许它人来进行添加、修改或删除数据,是四个隔离等级中限制最严格的种。由于必须等事务完成后,其它的事务才能使用这些表,别因此SERIALIZABLE的同时性最低,要使用相同数据的事务必须一个个循序地进行。由于同时发生性较低,因此只会在必要时才会使用此选项。 2022/8/810天津大学计算机基础教学部四种隔离级别允许不同类型的行为: 隔离级别脏 读不可重复读取幻 像未提交读是是是提交读否是是可重复读否否是可串行读否否否2022/8/811天津大学计算机基础教学部六、设计长度适宜的事务 设计事务时,必须确保将事务的持续时间减至最短。要进行该操作,可以更快的释放数据上的锁,使其它事务能够访问数
12、据。 1. 事务执行 应该将大型事务划分为几个较小的步骤,并在每个步骤完成之后将它们提交。这样能更快的释放锁。 还可以利用SQL Server的批语句。一旦具有相同的连接, 批语句就会向SQL Server发送多个T-SQL语句, 这将有助于节省打开其它网络连接的时间。如果批语句中包含多个 SELECT语句,服务器会返回一串结果集。 2. 代码生效事务 将事务持续时间减至最短的方法是将用户的输入量减至最少。 理解并选择最佳的事务隔离级别和游标并发选项,并不是所有的事务都需要高的串行隔离级别。 某些应用程序即使使用较低的“提交后读”事务隔离级别, 也可以正常发挥功能。 2022/8/812天津大
13、学计算机基础教学部13.2 事务的编程一、创建事务 创建事务是由BEGIN TRANSACTION 语句标志着事务的开始。语法: BEGIN TRANSACTION 事务名 | 事务名变量 参数说明:事务名是指派给事务的名字。该参数必须符合标识符的命名规则,仅只用事务名的前32个字符。事务变量名是包含有效事务名的自定义变量名。该变量可以声明为CHAR、VARCHAR、NCHAR 或 NVARCHAR数据类型。 2022/8/813天津大学计算机基础教学部二、提交事务 提交事务用COMMIT命令。该语句用于结束没有错误发生的事务。 语法:(1)COMMIT TRANSACTION 事务名 | 事
14、务名变量(2)COMMIT WORK参数说明:事务名可以被SQL Server忽略。该参数说明由先前的BEGIN TRANSACTION语句分配给事务的名字,可以为程序员提供可读性帮助,指出哪一个嵌套的事务与提交的事务相关联。事务名变量是包含有效事务名的自定义变量名。 该变量可以声明为CHAR、VARCHAR、NCHAR 或 NVARCHAR 数据类型 2022/8/814天津大学计算机基础教学部例13-1:员工代码为000002的内部候选人被选中担任销售经理(职位代码=0001)。为此需要更新表Employee。此外,还需要更新Position表中的当前人手。完成上述任务的 update 语
15、句如下: UPDATE Employee SET cCurrentPosition = 0001 WHERE cEmployeeCode= 000002 UPDATE Position SET iCurrentStrength=iCurrentStrength+1 WHERE cPositionCode=0001 如果在两句更新语句之间出现系统崩溃,则会导致数据的不一致。这应该避免。要避免这一点,必须确保这两句语句要么都执行,要么都不执行: 2022/8/815天津大学计算机基础教学部代码如下: BEGIN TRANSACTION trnUpdatePosition UPDATE Employ
16、ee SET cCurrentPosition = 0001 WHERE cEmployeeCode= 000002 UPDATE Position SET iCurrentStrength=iCurrentStrength+1 WHERE cPositionCode=0001 COMMIT TRANSACTION trnUpdatePosition 可以验证: SELECT * FROM PositionWHERE cPositionCode=0001 SELECT * FROM EmployeeWHEREcEmployeeCode=000002 2022/8/816天津大学计算机基础教学部
17、三、回滚事务语法: ROLLBACK TRANSACTION 事务名 |事务名变量 |保存点名 |保存点变量 参数说明:事务名 是指派给事务的名字。该参数必须符合标识符的命名规则,仅 只用事务名的前32个字符。事务变量名 是包含有效事务名的自定义变量名。该变量可以声明为 CHAR、VARCHAR、NCHAR或NVARCHAR数据类型保存点名 是指派给保存点的名字。保存点名必须符合标识符繁荣命名 规则。保存点变量 是包含有效保存点名的自定义变量名。 该变量可以声 明为CHAR、VARCHAR、NCHAR或NVARCHAR数据 类型。注意,当用保存点回滚事务的时候,SQL Server并不释放资源
18、。 2022/8/817天津大学计算机基础教学部例13-2: 还原所做的修改。 表RecruitmentAgencies的属性mTotalPaid 的值要增加5000,属性siPercentageCharge 的值要增加5,使用的命令如下: UPDATE RecruitementAgencies SET mTotalPaid=mTotalPaid+5000 WHERE cAgencyCode=0001 UPDATE RecruitmentAgencies SET sipercentagecharge=sipercentagecharge+5 WHERE cAgencyCode=0001 这些语
19、句应当具有原子性,且当siPercentageCharge 的平均值大于7时,UPDATE语句所作的修改必须还原,代码如下:2022/8/818天津大学计算机基础教学部BEGIN TRANSACTIONUPDATE RecruitmentAgenciesSET mTotalPaid=mTotalPaid+5000 WHERE cAgencyCode=0001UPDATE RecruitmentAgenciesSET sipercentagecharge=sipercentagecharge+5WHERE cAgencyCode=0001IF (select avg(siPercentageCh
20、arge) FROM RecruitmentAgencies)7 BEGIN PRINT Average Percentage Charge cannot be more than 15 ROLLBACK TRANSACTION ENDELSE BEGIN PRINT The transaction commited COMMIT TRANSACTION END 验证:SELECT AVG(siPercentageCharge) FROM RecruitmentAgenciesSELECT * FROM RecruitmentAgencies WHERE cAgencyCode=0001 20
21、22/8/819天津大学计算机基础教学部四、保存事务 提交事务时,必须在事务内设置保存点。保存点把事务分隔成几个逻辑单元,以致于事务能回到保存点,即使有部分事务被有条件的取消。如果回滚事务到保存点,事务必须继续完成或必须完全取消。 语法:SAVE TRANSACTION 保存点名 | 保存点变量参数说明:保存点名 是指派给保存点的名字。保存点名必须符合标识符繁荣命名规则。保存点变量 是包含有效保存点名的自定义变量名。该变量可以声明为CHAR、VARCHAR、NCHAR 或 NVARCHAR 数据类型。 2022/8/820天津大学计算机基础教学部例13-3: 还原事务的一部分。JobFair
22、表更新如下: UPDATE JobFair SET mFee=mFee+1000 WHERE cJobFairCode=0002 UPDATE JobFair SET dFairDate=getdate() WHERE cJobFairCode=0001ContractRecruiter 表更新如下: UPDATE contractrecruiter SET siPercentageCharge=siPercentageCharge+1 WHERE cContractRecruiterCode=0001 UPDATE ContractRecruiter SET mTotalPaid=mTota
23、lPaid+1000 WHERE cContractRecruiterCode=0001所有的更新应当一起进行。如果cContractRecruiterCode 为0001的记录的siPercentageCharge属性大于15 ,则不允许表ContractRecruiter 上的事务,但对于JobFair表上的事务应当允许。代码如下: 2022/8/821天津大学计算机基础教学部BEGIN TRANSACTION UPDATE JobFair SET mFee=mFee+1000 WHERE cJobFairCode=0002UPDATE JobFair SET dFairDate=getd
24、ate() WHERE cJobFairCode=0001SAVE TRANSACTION trnJobTransactionUPDATE contractrecruiter SET siPercentageCharge=siPercentageCharge+1WHERE cContractRecruiterCode=0001UPDATE ContractRecruiter SET mTotalPaid=mTotalPaid+1000WHERE cContractRecruiterCode=0001IF ( SELECT siPercentageCharge FROM ContractRecr
25、uiter WHERE cContractRecruiterCode=0001)15 BEGIN PRINT Transaction of Contract Recruiter being Rolled back ROLLBACK TRANSACTION trnJobTransaction ENDELSE BEGIN COMMIT TRANSACTION PRINT Transaction committed END2022/8/822天津大学计算机基础教学部五、在存储过程中创建事务例13-4:利用事务创建过程。创建一个叫 prcUpdatePosition 过程执行下列事务: BEGIN T
26、RANSACTION trnUpdatePosition UPDATE Employee SET cCurrentPosition = 0001 WHERE cEmployeeCode= 000002 UPDATE Position SET iCurrentStrength=iCurrentStrength+1 WHERE cPositionCode=0001 COMMIT TRANSACTION trnUpdatePosition代码如下:CREATE PROCEDURE prcUpdatePositionASBEGIN TRANSACTION trnPositionUpdateUPDATE
27、 Employee SET cCurrentPosition = 0001WHERE cEmployeeCode = 000002UPDATE Position SET IcurrentStrength = iCurrentStrength + 1WHERE cPositionCode = 0001COMMIT TRANSACTION trnPositionUpdateRETURN2022/8/823天津大学计算机基础教学部六、嵌套事务 对COMMIT TRANSACTION 每个调用都应用于最后执行的BEGIN TRANSACTION。 如果嵌套BEGIN TRANSACTION语句,那CO
28、MMIT语句只应用于最后一个嵌套的事务,也就是在最内层的事务。即使嵌套事务内部的COMMIT TRANSACTION语句引用外部事务的事务名,该提交也只应用于最内层的事务。 ROLLBACK TRANSACTION语句的 transaction_ name 参数引用一组命名的嵌套事务的内层事务是非法的,transaction_name 只能引用最外部事务的事务名。如果在一组嵌套事务的任意级别执行使用外部事务名称的 ROLLBACK TRANSACTION transaction_name 语句, 那么所有的嵌套事务都将回滚。如果在一组嵌套事务的任意级别执行没有 transaction_name
29、 参数的ROLLBACK TRANSACTION 语句, 那么它将回滚所有嵌套事务,包括最外部事务。 一般,用trancount确定嵌套层次,允许事务嵌套但并推荐这么用。 2022/8/824天津大学计算机基础教学部 13.3 锁和死锁 SQL Server是通过锁(Lock)来确保事务完整性和数据库一致性。锁能避免用户读取其他用户更改的数据,并且避免单个用户同时更新同一笔数据。因此,当数据末使用锁时,此时在数据库中的数据可能被其他人进行修改或删除,而造成数据的不正确,使得针对这笔数据执行的查询作业生成非预期的结果。 2022/8/825天津大学计算机基础教学部在SQL Server中可提供的
30、锁定资源有:(1)数据库:可以锁定整个数据库。(2)表格: 可以锁定整个表格,包括所有数据和索引。(3)外延: 指一组连续的8K的数据页或索引页。(4)页: 指8K的数据页或索引页。(5)键: 可以锁定索引的行,用于保护序列化事务处 理中的关键字。(6)RID: 行识别项(Row Identifier,RID), 用来锁 定表里的个别行。 一、锁 在SQL Server中,拥有多个数据点的锁,来允许事务锁定不问类型的资源。为了把锁定的成本降于最低,SQL Server据工作的适当层级来锁资源。 2022/8/826天津大学计算机基础教学部例13-5:给出下列语句更新ExternalCandid
31、ate表中的信息。 在 cCandidateCode为000002的候选人参加测试之后,修改表中的 测试成绩和测试日期的信息。 BEGIN TRANSACTION UPDATE ExternalCandidate SET siTestScore = 90 WHERE cCandidateCode= 000002 UPDATE ExternalCandidate SET dTestDate=getdate() WHERE cCandidateCode= 000002 当上述事务正在执行时,用户2想要安排候选人的面试,但他无法查询候选人的信息。BEGIN TRANSACTION SELECT *
32、FROM ExternalCandidate WHERE siTestScore80UPDATE ExternalCandidate SET dInterviewDate = getdate()+2WHERE siTestScore80COMMIT TRANSACTION 当第一用户更新表的时候,SQL Server锁定了表,工作完成后, SQL Server才释放了锁。用户2 必须等待,直到锁被释放。用户1在COMMIT TRANSACTION后,事务进行的过程中检验表是否被锁定。在终端2上执行COMMIT TRANSACTION。 2022/8/827天津大学计算机基础教学部二、SQL S
33、erver锁模式 为事务处理而访问资源,SQL Server用锁的方式解决位于并发事务中的冲突。SQL Server使用的资源锁模式为: 锁模式说 明共享锁用于不是修改或更新操作(只读操作),如SELECT语句更新锁用于资源更新,防止通常形式的死锁发生,即多个事务在读,锁定稍后可能有更新资源的请求。排它锁用于数据修改操作,比如更新、插入和删除。这方式保证不能同时对相同资源进行更新操作。意图锁用于建立锁的分层机构。模式锁用于当操作依赖于正在执行的表的模式。2022/8/828天津大学计算机基础教学部1. 共享锁 从机能上讲,允许并发事务同时读资源。 如果资源上用了共享锁,其它事务就不能修改它上面
34、的数据了。当事务完成读操作以后,资源由共享锁释放。但是也可能不释放, 当事务隔离级别设为可重复读或更高的,或锁定提示是在整段事务处理时期内保持共享锁。 2. 更新锁 当两个并发事务获取资源上的共享模式锁,然后企图同时更新数据,这时第一个事务尝试转换锁为排它锁。在这种情形下,从共享方式转换到排它锁则必须等待。这是因为一个事务的排它锁与其它共享方式的锁不兼容。因此发生了所等待。第二个事务为了自己的处理,修改数据并申请获取排它锁。当两个事务从共享锁转换到排它锁,死锁就发生了,因为每个事务在等待另一个事务释放它的共享模式锁。因此,更新锁常用于避免潜在的死锁问题。SQL Server同时只允许一个事务获
35、得资源上的一把更新锁。 2022/8/829天津大学计算机基础教学部3. 排它锁 专门限制并发事务访问同一资源。在事务的排它锁模式里没有其它事务能读或修改由排它锁锁定的数据。4. 意向锁 指SQL Server想在分层结构上获取某些资源的共享或排它锁。意向锁改善SQL Server的性能。 意向锁的特点:(1)意向共享。指出事务意图通过在个别资源上放置共享锁的方法在分层结构上读一些而不是全部资源。(2)意向排它。指出事务意图通过个别资源上放置排它锁的方法在分层结构上更新一些而不是全部资源。意向共享锁模式是意向排它锁模式的子集.(3)具有意向排它的共享。指出事务意图通过个别资源上放置排它锁的方法
36、在分层结构上允许并发事务读最高级的资源和更新一些而不是全部资源。每个表上不允许同时有一个以上的具有意向排它的共享锁。 2022/8/830天津大学计算机基础教学部5. 模式锁 当在表上使用数据定义语言时,SQL Server考虑模式修改锁。当编译查询时,SQL Server考虑模式稳定锁。 稳定锁不阻断包括排它锁在内的其它锁。因此,当查询在编译时其它事务也能运行, 甚至在表上拥有排它锁的事务。 三、死锁及死锁的处理 死锁就是指当两个事务在不同的对象上有锁,又计划在对方的对象上加锁的时候发生操作,这样就会导致僵局,因为除非对方释放锁, 否则双方都无法释放自己的锁并完成其任务。 SQL Serve
37、r可以通过选择一个事务并强制其释放锁,以便让另一个事务继续执行的方法来自动解决这个问题。 2022/8/831天津大学计算机基础教学部表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了。同样用户B要等用户A释放表A才能继续这就死锁了。 下面总结 SQL Server 中死锁产生的原因及解决办法。其实,所有的死锁最深层的原因就是一个: 资源竞争解决方法: 这种死锁是由于你的程序的BUG产生的, 除了调整你的程序的逻辑别无他法。
38、仔细分析你程序的逻辑,第一,尽量避免同时锁定两个资源;第二,必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。 2022/8/832天津大学计算机基础教学部表现二: 用户A读一条纪录,然后修改该条纪录。这是用户B修改该条纪录。这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。解决方法: 让用户A的事务(即先读后写类型的操作),在执行SELECT时用UPDATE L
39、OCK语句进行处理,本语法为: UPDATE table1(更新锁)FORM table2(共享锁)SET WHERE table1.id=table2.id UPDATE table2(更新锁)FORM table1(共享锁)SET WHERE table1.id=table2.id 2022/8/833天津大学计算机基础教学部四、使用TRANCOUNT处理错误 TRANCOUNT是用来计算目前连接中现用事务的数目。 TRANCOUNT受影响的语句有: 语 句对TRANCOUNT的影响BEGIN TRANSACTION加1COMMIT减1ROLLBACK设为0SAVE TRAN savepo
40、int无影响ROLLBACK TRAN savepoint无影响2022/8/834天津大学计算机基础教学部例13-6:本例演示在将 IMPLICIT_TRANSACTIONS 设置为 ON 时显式或隐式启动事务。它使用 TRANCOUNT 函数演示打开的事务和关闭的事务。代码如下:CREATE table t1 (a int) GOINSERT INTO t1 VALUES (1) GOPRINT Use explicit transactionBEGIN TRANINSERT INTO t1 VALUES (2)SELECT Tran count in transaction= TRANC
41、OUNT -1COMMIT TRANSELECT Tran count outside transaction= TRANCOUNT -0GOPRINT Setting IMPLICIT_TRANSACTIONS ONGOSET IMPLICIT_TRANSACTIONS ONGOPRINT Use implicit transactionsGO2022/8/835天津大学计算机基础教学部- No BEGIN TRAN needed here.INSERT INTO t1 VALUES (4)SELECT Tran count in transaction= TRANCOUNT -1COMMI
42、T TRANSELECT Tran count outside transaction= TRANCOUNT 0 GOPRINT Use explicit transactions with IMPLICIT_TRANSACTIONS ON GOBEGIN TRANINSERT INTO t1 VALUES (5)SELECT Tran count in transaction= TRANCOUNT -2COMMIT TRANSELECT Tran count outside transaction= TRANCOUNT 1 GOSELECT * FROM t1 GO- Need to com
43、mit this tran too!DROP TABLE t1COMMIT TRANSELECT Tran count in the end= TRANCOUNT -0GO2022/8/836天津大学计算机基础教学部 13.4 分布式事务 所谓的分布式事务(Distributed Transaction)是指当事务过程中,有跨越两个或多个数据库时的事务,但是SQL Server是由内部来管理分布式事务,对于用户而言则是以本地事务来运作。 分布式事务由于要跨越两个或多个数据库,因此又称为资源管理员的服务器。事务的管理必须由一种称为事务管理员DTC的服务器控件在资源管理员之间协调,来负责统筹整个的事务工作。2022/8/837天津大学计算机基础教学部一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装修人工费合同
- 景观亮化工程合同
- 知识产权与保密合同协议书
- 车辆雇佣合同协议书
- 旅游度假产品预订与退改签免责协议
- 纪录片拍摄合作协议
- 速录服务合同
- 2024-2025学年福建省泉州市四校高三上学期第一次联考语文试卷
- 现代家居装饰艺术与科技融合的探索
- N2级护理测试题(含答案)
- 苏州2025年江苏苏州太仓市高新区(科教新城娄东街道陆渡街道)招聘司法协理员(编外用工)10人笔试历年参考题库附带答案详解
- 幼儿园课件:健康教案
- 2025至2031年中国助眠床垫行业投资前景及策略咨询研究报告
- 绵阳市高中2022级(2025届)高三第二次诊断性考试(二诊)语文试卷(含答案)
- 常州初三强基数学试卷
- 2025年极兔速递有限公司招聘笔试参考题库含答案解析
- 苏少版小学一年级下册综合实践活动单元备课
- 铁岭卫生职业学院单招参考试题库(含答案)
- 平安个人信用贷款申请表(共3页)
- 化工自动化控制仪表国家题库
- 烟草专卖局卷烟打假经验介绍材料:以打击制售假烟网络案件为抓手全面推进市场监管上水平
评论
0/150
提交评论