zoukankan      html  css  js  c++  java
  • sqlserver关于事务

    事务的四个特性: 原子性,一致性,持久性,隔离性

    原子性:

    原子性:表示事务执行是作为原子,不可分割,整个语句要么执行,要么不执行
    sqlserver中每一个单独的语句可以看做是包含在事务中
    每一句本身具有原子性,要么执行,要么不执行,不会有中间状态

    CREATE TABLE Student1
    (
    Id INT
    CONSTRAINT chk_test
    CHECK (Id = 3)
    )
    
    INSERT INTO Student1
    VALUES(3),(4)

    例如:上面例子的约束,执行插入3成功执行,但是插入4失败,这时候也会导致3插入失败

    因为它们是一个语句,每一个语句具有原子性,要么都执行成功,要么都执行失败

    当然这种原子比较小,用户可以自定义原子的大小:

    则需要包含在事务中,来构成用户自定义的原子粒度

    注意:默认事务中,即使出错了也不会整个事务进行回滚,而是失败的语句抛出异常,而正确的语句成功执行,这样会破坏事务的原子性,所以sqlserver给与了一些选项来保证事务的原子性

    提供了两大类保证事务的原子性

    1 通过设置 set xact_abort on 为on,来设置所有事务都作为一个原子处理

    例如:

    SET  XACT_ABORT ON
    BEGIN TRANSACTION
    INSERT INTO Student1
            VALUES(3)
            
    INSERT INTO Student1
            VALUES(4)
            
    COMMIT
    GO
    SELECT * FROM Student1 AS s

    2 按照用户设置进行回滚

    这种方式具有更高的灵活性,可以自定义在什么情况进行rollback,利用try catch和@@error进行判断都属于这种方式

    BEGIN TRANSACTION
    
    BEGIN TRY
        INSERT INTO Student1(Id)
                VALUES (3) 
    
        INSERT INTO Student1(Id)
                VALUES (4) 
    
            COMMIT
    END TRY
    BEGIN CATCH
        ROLLBACK
    END CATCH

    一致性: 即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏

    隔离性:事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据

    sqlserver利用加锁和阻塞来保证不同事务之间不同等级的隔离性

    一般情况,完全隔离是不现实的,完全的隔离要求数据库同一时间只执行一条事务,这是不现实的

    所以事务之间的互相影响分为:脏读,不可重复读,幻读

    脏读:一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的


    隔离等级:

    Read Uncommited(最高的性能,但可能出现脏读,不可重复读,幻读)

    Read commited(可能出现不可重复读,幻读)(满足99%的需求)

    Repeatable Read(可能出现幻读)

    Serializable(最低的性能,Range锁会导致并发下降)

    SNOPSHOT(这个是通过在tempDB中创建一个额外的副本来避免脏读,不可重复读,会给tempDB造成额外负担)

    总之:不同的隔离级别是通过添加不同的锁,造成阻塞来实现的

    设置隔离级别:


    隔离等级:

    Read Uncommited(最高的性能,但可能出现脏读,不可重复读,幻读)

    Read commited(可能出现不可重复读,幻读)(满足99%的需求)

    Repeatable Read(可能出现幻读)

    Serializable(最低的性能,Range锁会导致并发下降)

    SNOPSHOT(这个是通过在tempDB中创建一个额外的副本来避免脏读,不可重复读,会给tempDB造成额外负担)

    总之:不同的隔离级别是通过添加不同的锁,造成阻塞来实现的


    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    SELECT * from student1


    持久性: 意味着事务完成后,该事务对数据库所做的更改便持久的保存在数据库之中

    格式:

    BEGIN TRY
    
    BEGIN TRANSACTION
    COMMIT TRANSACTION
    
    END TRY
    BEGIN CATCH    
    IF @@TRANCOUNT > 0 or xact_state() <>0
    ROLLBACK TRANSACTION ;
    
    SELECT 0;
    END CATCH


    @'在SqlServer里,嵌套事务的层次是由@@TranCount全局变量反映出来的。
    每一次Begin Transaction都会引起@@TranCount加1。
    而每一次Commit Transaction都会使@@TranCount减1,
    而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,
    而使@@TranCount置0'

  • 相关阅读:
    限制次数登录系统
    1-10内的数字累加,输出和大于20的数字。
    输出某个年龄的人的比例
    计算100以内的所有偶数和
    计数器解决一个人数增长问题
    switch处理多分支结构
    if处理多分支结构
    webstom破解
    下拉框左右选择
    勾中行变色效果
  • 原文地址:https://www.cnblogs.com/niuzaihenmang/p/5715300.html
Copyright © 2011-2022 走看看