zoukankan      html  css  js  c++  java
  • 事务ACID

    A是原子性(atomic):事务中包含的各项操作必须全部成功执行或者全部不执行。任何一项操作失败,将导致整个事务失败,其他已经执行的任务所作的数据操作都将被撤销,只有所有的操作全部成功,整个事务才算是成功完成。    
    C是一致性(consistent):保证了当事务结束后,系统状态是一致的。那么什么是一致的系统状态?例如,如果银行始终遵循着"银行账号必须保持正态平衡"的原则,那么银行系统的状态就是一致的。上面的转账例子中,在取钱的过程中,账户会出现负态平衡,在事务结束之后,系统又回到一致的状态。这样,系统的状态对于客户来说,始终是一致的。    
    I是隔离性(isolated):使得并发执行的事务,彼此无法看到对方的中间状态。保证了并发执行的事务顺序执行,而不会导致系统状态不一致。    
    D是持久性(durable):保证了事务完成后所作的改动都会被持久化,即使是发生灾难性的失败。可恢复性资源保存了一份事务日志,如果资源发生故障,可以通过日志来将数据重建起来。
    银行转帐的例子是最经典的事务范例:  
    用户把钱从一个银行账号转账至另一个银行账号,需要将资金从一个银行账号中取出,然后再存入另一个银行账号中。理想来说,这两次操作都应该成功。但是,如果有错误发生,则两次操作都应该失败,否则的话,操作之后其中一个账号中的金额将会是错误的,整个操作过程应该是原子性的,两个操作都是一个原子事务操作的一部分。
    最简单比较在数据库里插入几条数据,COMMIT后,前面操作就是事务都提交了,不然ROLLBACK,事务就回退了。 
    事务的控制
     
    事务的开始是隐形声明的,不用也没有语句可以进行操作,默认从对数据的修改开始就开始了当前事务。
     
    对数据库的设置主要有一下语句:
     
    SET TRANSACTION-----设置事务属性
     
    SET CONSTRANS-------设置约束模式
     
    SAVEPOINT-----------建立存储点
     
    RELEASE SAVEPOINT---释放存储点
     
    ROLLBACK------------回滚
     
    COMMIT--------------提交
     
    1、设置事务属性
     
    设置事务属性主要可以用来完成以下工作:
     
    * 指定事务的隔离层
     
    * 规定回滚事务时所使用的存储空间
     
    * 命名事务
     
    注:SET TRANSACTION必须是事务的第一个语句。并在事务终止后自动失效。
     
    SET TRANSACTION ISOLATION LEVEL READ COMMITED
     
    A事务设置为READ COMMITED,该开始后B事务修改了数据,此时A无法得到新数据,B提交之后,A可以查询到更新数据。 A不可能错读,但可能发生假读和非重复读。
     
    在需要并发数很大时应该使用READ COMMITED,对于多用户并发的性能和响应速度都比较好。
     
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
     
    事务和事务之间完全隔离开,事务以串行的方式执行。不是说必须等一个结束,而是事务一旦开始,在结束之前查询到的数据永远是开始时刻的数据。由于留存的模式会比较多,所以会消耗一定的系统资源。
     
    SET TRANSACTION READ ONLY
     
    当前事务不能有任何修改数据的操作,READ ONLY是SERIALIZABLE的一个子集,基本上属于最高的安全级。
     
    SET TRANSACTION READ WRITE
     
    在READ的基础上增加WRITE权限,不常用
     
    2、设置约束延期性
     
    在操作过程中可能需要违反约束向表中插入重复的数据,其实需要设置约束延期性。
     
    设置格式如下:
     
    SET CONSTRAINT ALL | <constraint_name>
     
    DEFERRED | IMMEDIATE
     
    可以选择要延期的约束名,也可以使用ALL关键字延期所有的约束
     
    DEFERRED表示延期,IMMEDIATE表示应用
     
    注:理论上在COMMIT前需要设置回IMMEDIATE,但是系统可以隐式自动完成这一操作。
     
    注意:要使用延迟的约束,必须在创建时就进行说明:
     
    ALTER TABLE T1 ADD CONSTRAINT <constraint_name> DEFERRABLE INITIALLY IMMEDIATE
     
    后面的DEFERRABLE 指名可以使用延迟,INITIALLY 设定了初始值
     
    3、存储点
     
    由于事务太大,一次回滚会对系统造成很大的压力。而且有时候在某一段特定的代码附近会特别发生错误而回滚。这时就需要在希望的地方设置一个存储点,可以显示得操作数据在发生错误时回滚到指定的存储点,而节省不必要的开销。
     
    创建格式如下:
     
    SAVEPOINT <savepoint_name>
     
    使用格式如下:
     
    ROLLBACK TO [SAVEPOINT] <savepoint_name>
     
    4、结束事务
     
    以下操作为将事务结束:
     
    * 使用COMMIT提交事务,数据被永久保存
     
    * 使用ROLLBACK回滚事务(不包括回滚到存储点)
     
    * 执行DDL时,结束默认COMMIT
     
    * 用户断开连接,此时事务自动COMMIT
     
    * 进程意外中止,此时事务自动ROLLBACK
     
    注:事务COMMIT时会生成一个唯一的系统变化号(SCN)保存到事务表
  • 相关阅读:
    关于“jdk”版本不支持问题的总结
    Linux系统下jdk卸载安装、配置
    weblogic-jdk 问题
    MCU有哪些复位因素
    MCU固件升级(OTA)的几种Flash划分方式
    003_Linux常用命令之文件操作
    002_Linux常用命令之目录操作
    001_Linux常用命令之ls命令
    dup与dup2函数
    Linux 系统查询机器最近重启时间命令
  • 原文地址:https://www.cnblogs.com/chenning/p/4932076.html
Copyright © 2011-2022 走看看