第五章管理事务和管理数据库 管理事务 管理数据库
1 第五章 管理事务和管理数据库 • 管理事务 • 管理数据库
事务的由来 使用 DELETE命令或 UPDATE命令对数据库进行更 新时,一次只能操作一个表,这会带来数据库的数据 不一致的问题。例如企业取消了后勤部,需要将后勤 部从 departmen表中删除,要修改 department表,而 employee表中的部门编号与后勤部相对应的员工也应 删除。因此,两个表都需要修改,这种修改只能通过 两条 DELETE语句进行。假设后勤部编号为1012 第一条 DELETE语句修改 department表 delete from department where dept id=’1012 第二条 DELETE语句修改 employee表 delete from employee where dept id =21012'2
2 事务的由来 • 使用DELETE 命令或UPDATE 命令对数据库进行更 新时,一次只能操作一个表,这会带来数据库的数据 不一致的问题。例如企业取消了后勤部,需要将后勤 部从department表中删除,要修改department 表,而 employee 表中的部门编号与后勤部相对应的员工也应 删除。因此,两个表都需要修改,这种修改只能通过 两条DELETE 语句进行。假设后勤部编号为1012 • 第一条DELETE 语句修改department 表 • delete from department • where dept_id = ’1012’ • 第二条DELETE 语句修改employee 表 • delete from employee where dept_id = ’1012’
在执行第一条 DELETE语句后,数据库中的数 据已处于不一致的状态。因为此时已经没有后 勤部了,但 employee表中仍然保存着属于后勤 部的员工记录;只有执行了第二条 DELETE语 句后,数据才重新处于一致状态。但是如果执 行完第一条语句后,计算机突然出现故障,无 法再继续执行第二条 DELETE语句,则数据库 中的数据将处于永远不一致的状态。因此必须 保证这两条 DELETE语句同时执行。为解决类 似的问题,数据库系统通常都引入了事务 Transaction的概念
3 • 在执行第一条DELETE 语句后,数据库中的数 据已处于不一致的状态。因为此时已经没有后 勤部了,但employee 表中仍然保存着属于后勤 部的员工记录;只有执行了第二条DELETE 语 句后,数据才重新处于一致状态。但是如果执 行完第一条语句后,计算机突然出现故障,无 法再继续执行第二条DELETE 语句,则数据库 中的数据将处于永远不一致的状态。因此必须 保证这两条DELETE 语句同时执行。为解决类 似的问题,数据库系统通常都引入了事务 Transaction 的概念
事务的概念及特性 事务:指作为单个逻辑工作单元执行的 系列操作,而这些逻辑工作单元需要 具有原子性,一致性,隔离性和持久性 四个属性,统称ACID特性。 ·原子性:指事务必须是原子工作单元, 即对于事务所进行数据修改,要么全都 执行,要么全都不执行
4 事务的概念及特性 • 事务:指作为单个逻辑工作单元执行的 一系列操作,而这些逻辑工作单元需要 具有原子性,一致性,隔离性和持久性 四个属性,统称ACID特性。 • 原子性:指事务必须是原子工作单元, 即对于事务所进行数据修改,要么全都 执行,要么全都不执行
致性:指事务在完成时,必须使所有 的数据都保持一致性状态,而且在相关 数据库中,所有规则都必须应用于事务 的修改,以保持所有数据的完整性。事 务结束时,所有的内部数据结构都必须 是正确的
5 • 一致性:指事务在完成时,必须使所有 的数据都保持一致性状态,而且在相关 数据库中,所有规则都必须应用于事务 的修改,以保持所有数据的完整性。事 务结束时,所有的内部数据结构都必须 是正确的
隔离性:指由并发事务所做的修改必须与 任何其他并发事务所做的修改相隔离。事 务查看数据时数据所处的状态,要么是被 另一并发事务修改之前的状态,要么是被 另一事务修改之后的状态,即事务不会查 看正在由另一个并发事务正在修改的数据。 持久性:指事务完成之后,它对于系统的 影响是永久性的,即使出现系统故障也是 如此
6 • 隔离性:指由并发事务所做的修改必须与 任何其他并发事务所做的修改相隔离。事 务查看数据时数据所处的状态,要么是被 另一并发事务修改之前的状态,要么是被 另一事务修改之后的状态,即事务不会查 看正在由另一个并发事务正在修改的数据。 • 持久性:指事务完成之后,它对于系统的 影响是永久性的,即使出现系统故障也是 如此
事务的类型 隐式事务:每次执行 SQLServer的任何 数据修改语句时,它都是一个隐式事务。 例如:下列SQL语句是一个独立事务: Insert talbe values(1,abc) Update ta ble set coll=5 where coll=l Delete from ta bel where coll=5
7 事务的类型 • 隐式事务 :每次执行SQL Server的任何 数据修改语句时,它都是一个隐式事务。 例如:下列SQL语句是一个独立事务: • Insert talbe values(1,’abc’) • Update table set col1=5 where col1=1 • Delete from table1 where col1=5 • go
显式事务 通常在程序中用 BEGIN TRANSACTION命令来标识 个事务的开始,用 COMMIT TRANSACTION命令标识 事务结束;这两个命令之间的所有语句被视为一体。只 有执行到 COMMIT TRANSACTION命令时,事务中对 数据库的更新操作才算确认。和 BEGIN.END命令类 似。这两个命令也可以进行嵌套,即事务可以嵌套执行
8 显式事务 • 通常在程序中用BEGIN TRANSACTION 命令来标识一 个事务的开始,用COMMIT TRANSACTION 命令标识 事务结束;这两个命令之间的所有语句被视为一体。只 有执行到COMMIT TRANSACTION 命令时,事务中对 数据库的更新操作才算确认。和BEGIN…END 命令类 似。这两个命令也可以进行嵌套,即事务可以嵌套执行
这两个命令的语法如下 BEGIN TRANISACTION transaction name atran name variable COMMIT ITRANSACTIONI transaction name @tran name variable] 其中 BEGIN TRANSACTION可以缩写为 BEGIN TRAN。 COMMIT TRANSACTION可以缩写为 COMMIT TRAN 或 COMMIT。 transaction name:指定事务的名称,只有前32个字符 会被系统识别。 atran name variable:用变量来指定事务的名称变量。 只能声明为CHARⅤ ARCHAR NCHAR或 NVARCHAR 类型
9 • 这两个命令的语法如下 • BEGIN TRAN[SACTION] [transaction_name | @tran_name_variable] • COMMIT [ TRAN[SACTION] [transaction_name | @tran_name_variable] ] • 其中BEGIN TRANSACTION 可以缩写为BEGIN TRAN 。 COMMIT TRANSACTION可以缩写为COMMIT TRAN 或COMMIT 。 • transaction_name:指定事务的名称,只有前32 个字符 会被系统识别。 • @tran_name_variable:用变量来指定事务的名称变量。 只能声明为CHAR VARCHAR NCHAR 或NVARCHAR 类型
例:删除后勤部 declare @transaction name varchar (32) select transaction name=my transaction delete begin transaction @transaction name use sample delete from department where dept id=71012 delete from employee where dept id =10122 commit transaction my transaction delete go
10 • 例: 删除后勤部 • declare @transaction_name varchar(32) • select @transaction_name = ' my_transaction_delete ' • begin transaction @transaction_name • go • use sample • go • delete from department where dept_id = ’1012’ • go • delete from employee where dept_id = ’1012’ • go • commit transaction my_transaction_delete • go