• 事务


    什么是事务(Transaction)?
    指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)--也就是由多个sql语句组成,必须作为一个整体执行
    这些sql语句作为一个整体一起向系统提交,要么都执行、要么都不执行



    事务的4个特性:
    事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。
    原子性
    事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
    一致性
    事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
    隔离性
    由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
    持久性
    事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

    语法步骤:
    •开始事务:BEGIN TRANSACTION
    •事务提交:COMMIT TRANSACTION
    •事务回滚:ROLLBACK TRANSACTION
    判断某条语句执行是否出错:
    •全局变量@@ERROR;
    •@@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;

     1 --事务,以一个转账为例子
     2 create table bank
     3 (
     4     cId char(4) primary key,--customerID用户的id
     5     balance money,            --余额
     6 )
     7 
     8 alter table bank
     9 add constraint CH_balance check(balance >=10)--检查约束,余额必须大于等于10块;
    10 
    11 go
    12 --模拟数据
    13 insert into bank values('0001',1000)
    14 insert into bank values('0002',10)
    15 go
    16 ---------------------------------------------------
    17 
    18 --开启事务,用户1给用户2转900
    19 begin transaction
    20 declare @myError int;
    21 set @myError = 0;
    22     update bank set balance=balance - 900 where cid='0001';
    23     set @myError += @@ERROR;
    24     update bank set balance=balance + 900 where cid='0002';
    25     set @myError += @@ERROR;
    26 if(@myError > 0)
    27 begin
    28     rollback transaction;--事务回滚
    29 end
    30 else
    31 begin
    32     commit transaction;--提交事务
    33 end
    34 
    35 select * from  bank;--看看转账成功了吗?转1000试试?


    ->SET IMPLICIT_TRANSACTIONS { ON | OFF }


    如果设置为 ON,SET IMPLICIT_TRANSACTIONS 将连接设置为隐式事务模式。如果设置为 OFF,则使连接恢复为自动提交事务模式。
    SET   IMPLICIT_TRANSACTIONS     ON   --用户每次必须显式提交或回滚。否则当用户断开连接时,   
                                                                  --事务及其所包含的所有数据更改将回滚      
    SET   IMPLICIT_TRANSACTIONS     OFF   --自动提交模式。在自动提交模式下,如果各个语句成功   
                                                                    --完成则提交。 

    事务分类:
    1 显式事务:用begin transaction明确指定事务的开始。
    2 隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
    3 自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。
     

  • 相关阅读:
    Java 深拷贝和浅拷贝 利用序列化实现深拷贝
    算法题005 剑指Offer面试题29 数组中出现次数超过一半的数字
    算法题003 斐波那契(Fibonacci)数列
    Android Sensors (4) 传感器使用最佳实践
    Android WebView使用基础
    Java 多线程(八) 线程状态图
    算法题006 判断两个链表是否相交
    Java 多线程(五) 多线程的同步
    算法题001 剑指Offer 面试题三:二维数组中的查找
    Android绘制基础及手写绘制实例
  • 原文地址:https://www.cnblogs.com/kongsq/p/3866296.html
Copyright © 2020-2023  润新知