SQLserver事务处理

来源:互联网 发布:大学java专业入门课程 编辑:程序博客网 时间:2024/05/17 08:31

  1、sql数据库事务处理的四个重要属性:原子性,一致性,隔离性,持久性。

  2、事务模式:自动提交事务,显式事务,隐式事务,批处理级事务。

  3、显式事务:(1)BEGIN TRANSACTION语句:用于启动一个事务,它标志着事务的开始。BEGIN TRAN[SACTION][transaction_name|@tran_name_variable[WITH MARK['description']]]。transaction_name:表示设定事务的名称,字符个数最多为32个字符。@tran_name_variable:表示用户定义的、含有有效事务名称的变量名称,必须用char,vchar,nchar或nvachar数据类型声明该变量。WITH MARK['description']:表示指定在日志中标记事务,description是描述该标记的字符串。

                          (2)COMMIT TRANSACTION语句:用于标志一个成功的隐式事务或用户定义事务的结束。COMMIT [TRAN[SACTION][transaction_name|@tran_name_variable]]。transaction_name:表示此参数指定由前面的BEGIN TRANSACTION 指派的事务名称,此处的事务名称仅用来帮助程序员阅读,以及指明COMMIT TRANSACTION与哪些嵌套的BEGIN TRANSACTION相关联。@tran_name_variable:表示用户定义的、含有有效事务名称的变量名称,必须用char,varchar,nchar或nvarchar数据类型声明该变量。

                          (3)COMMIT WORK语句:用于标志事务的结束。COMMIT [WORD]此语句的功能与COMMIT TRANSACTION相同,但COMMIT TRANSACTION接受用户定义的事务名称。

                          (4)ROLLBACK TRANSACTION语句:用于将显式事务或隐式事务回滚到事务的起点或事务内的某个保存点。当执行事务的过程中发生某种错误,可以使用ROLLBACK TRANSACTION语句或ROLLBACK WORK语句,使数据库撤销事务中所作的更改,并使数据恢复到事务开始之前的状态。ROLLBACK[TRAN[SACTION][transaction_name|@tran_name_variable|savepoint_name|@savepoint_variable]]。transaction_name:表示BEGIN TRAN对事务名称的指派。@tran_name_variable:表示用户定义的、含有有效事务名称的变量名称,必须用char,varchar,nchar或nvarchar:数据类型声明该变量。savepoint_name:是来自SAVE TRANSACTION语句对保存点的定义,当条件回滚只影响事务的一部分时使用savepoint_name。@savepoint_variable:表示用户定义的、含有有效保存点名称的变量名称。

                          (5)ROLLBACK WORK语句:用于将用户定义的事务回滚到事务的起点。ROLLBACK [WORK]此语句的功能与ROLLBACK TRANSACTION相同,除非ROLLBACK TRANSACTION接受用户定义的事务名称。

                          (6)SAVE {TRAN|TRANSACTION}{savepoint_name|@savepoint_variable}[;]。savepoint_name:是保存点的名称,它必须符合标识符规则,当条件回滚响应只影响事务的一部分时,可使用savepoint_name。@savepoint_variable:是用户定义的、包含有效保存点名称的变量名称,他必须用char,varchar,nchar或nvarchar数据类型声明变量。

                          (7)SET TRANSACTION ISOLATION LEVEL{READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE}。READ COMMITTED:指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻象读取数据。READ UNCOMMITTED:执行脏读或0级隔离锁定,这表示不发出共享锁,也不接受排他锁。该选项的作用与在事务内所有语句中的所有表上设置NOLOCK相同,这是4个隔离级别中限制最小的级别。REPEATABLE READ:锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻象读插入数据集,且幻象读包括在当前事务的后续读取中,因为并发低于默认隔离级别,所以应只在必要时才使用该项。SERIALIZABLE:表示在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。

  4、隐式事务:隐式事务需要使用SET IMPLICIT_TRANSACTIONS ON语句将隐式事务模式设置为打开。在打开了隐式事务的设置开关时,执行下一条语句时自动启动一个新事务,并且每关闭一个事务时,执行下一条语句又会启动一个新事务,直到关闭了隐式事务的设置开关。SQL server的任何修改语句都是隐式事务,例如,ALTER TABLE、CREATE、DELETE、DROP、FETCH、GRANT、INSERT、OPEN、REVOKE、SELECT、TRUNCATE TABLE、UPDATE。这些语句都可以作为一个隐式事务的开始。如果要结束隐式事务,需要使用COMMIT TRANSACTION或ROLLBACK TRANSACTION语句来结束事务。

  5、实例1:BEGIN TRANSACTION 事务名

                       UPDATE 表名 SET 列名='' WHERE 列名=''

                        COMMIT TRANSACTION 事务名

  6、实例2:BEGIN TRANSACTION 事务名

                        INSERT INTTO 表名 VALUES('','','')

                        COMMIT TRANSACTION 事务名

                        GO

                         IF @@ERROR=0

                         PRINT '插入记录成功'

                        GO                         

  7、实例3:BEGIN TRANSACTION 事务名

                     UPDATE 表名 SET 列名='' WHERE 列名=''

                    DELETE 表名 WHERE 列名=''

                    COMMIT TRANSACTION 事务名

  8、事务并发问题:丢失更新,未确认的相关性,不一致的分析,幻象读。

0 0