数据库-事务

什么是数据库事务
         数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
意思就是一连串的数据库操作,即一串增删查改的集合。

数据库事务做了什么
        它把数据库从一个一致的状态转换到另一个一致的状态,比如数据库操作前是一个点,数据库操作后是一个点,
我们只管这两个点的状态,而两点之间的连线上的状态我们不管因为他们可能对我们想要的结果产生影响。
 
代码
BEGIN TRANSACTION        -- 开始事务
UPDATE TRegister SET Balance = Balance + 199 WHERE Id = 1
UPDATE TRegister SET Balance = Balance - 199 WHERE Id = 6       -- 因违法CHECK(Balance>0)约束而报错
COMMIT TRANSACTION     -- 提交事务

 

然而,SQL SERVER 在失败时并不是都可以自动回滚事务(默认约束和锁超时会让事务一直打开)。所以,我们需要:
SET XACT_ABORT ON | OFF  -- 设置只要有错误(无论级别)就回滚事务

在实际开发中,我们通常采用TRY...CATCH的方式来处理:

BEGIN TRANSACTION
BEGIN TRY
    UPDATE TRegister SET Balance = Balance + 150 WHERE Id = 1
    UPDATE TRegister SET Balance = Balance - 150 WHERE Id = 6
    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    IF @@TRANCOUNT>0
        ROLLBACK;
    THROW;
END CATCH

TRY...CATCH(异常捕获):

  • 如果没有任何异常(错误),执行完 TRY块(BEGIN...END)之间的内容
  • 否则,直接从错误行跳到 CATCH 块

 

显式事务

声明了 BEGIN TRANSACTION 的事务就是显式事务。事务从 BEGIN TRANSACTION 开始,至 COMMIT 或 ROLLBACK 结束。

  • 提交(COMMIT):执行所有从BEGIN TRANSACTION 开始的操作,结束事务
  • 回滚(ROLLBACK):撤销所有从BEGIN TRANSACTION 开始的操作,恢复原样


隐式事务

SET IMPLICIT_TRANSACTIONS ON | OFF   -- SQL SERVER 默认是OFF的

不需要声明:BEGIN TRANSACTION。从第一行开始(或者上一个COMMIT或ROLLBACK)就是事务起点,直到COMMIT或ROLLBACK才结束。


自动提交

未声明 BEGIN TRANSACTION 的单个SQL语句,自动的受事务控制。

比如:UPDATE...SET column_1 = x, column_2 = y,不可能只更改了column_1,没更改column_2

 

事务特性:ACID

原子性(Atomicity):不可再分。

一致性(Consistency):要完成都完成,要不完成都不完成。

隔离性(Isolation):正在执行的事务不能被其他事务干扰。

持久性(Durablity):一旦完成,改变就是永久性的。

文章转载自:快速开发平台– 云微平台
地址:https://www.hocode.com/

posted @ 2022-02-12 16:44  码上的飞鱼  阅读(43)  评论(0)    收藏  举报