SQL基础15——数据库事务(TRANSACTION)

一、数据库事务

    数据库事务是指作为单个逻辑工作单元执行的一系列操作,可以认为事务就是一组不可分割的SQL语句

   

二、数据库事务的ACID属性

    原子性(atomic)

       事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

 

    一致性(consistent)

       事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务

        的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如B 树索引或双向链

        表)都必须是正确的。

 

    隔离性(insulation)

       由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状

        态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中

        间状态的数据。

 

    持久性(Duration)

       事务完成之后,它对于系统的影响是永久性的。

 

三、事务的组成

    一个数据库事务可由:

       一个或多个DML语句组成

       一个DDL语句组成

       一个DCL语句组成

 

    一个数据事务由:

       以第一个DML语句的执行作为开始

       以下面的其中之一作为结束

           commit     (提交)

           rollback   (回滚)

           ddl或dcl语句   (自动提交)

           用户会话正常结束(自动提交) 

           系统异常终止 (自动回滚)

           系统崩溃 (自动回滚)

 

四、事务的提交或回滚(COMMIT、ROLLBACK)       

    --使用COMMIT事务,robinson记录被插入到表

       SQL> INSERT INTO scott.emp(empno,ename,job,salary)

         2  VALUES(9999,'Robinson','DBA',3500);

 

       1 row created.

 

       SQL> COMMIT;

 

       Commit complete.

 

       SQL> UPDATE scott.emp SET salary = 4000 WHERE ename = 'Robinson';

 

       1 row updated.

 

    --使用ROLLBACK回滚,更新将失效,最终结果如下面的查询

       SQL> ROLLBACK;

 

       Rollback complete.

 

       SQL> SELECT * FROM scott.emp WHERE ename = 'Robinson';

 

            EMPNO ENAME                          JOB              MGR HIREDATE      SALARY     DEPTNO

       ---------- ------------------------------ --------- ---------- --------- ---------- ----------

             9999 Robinson                       DBA                                  3500 

 

五、保存点

    设置保存点:

       SAVEPOINT NAME

    恢复至保存点:

       ROLLBACK TO NAME

 

    --查看empno为,的记录  

       SQL> SELECT * FROM scott.emp WHERE empno IN (1235,1236);

 

            EMPNO ENAME                          JOB              MGR HIREDATE      SALARY     DEPTNO

       ---------- ------------------------------ --------- ---------- --------- ---------- ----------

             1235 Tony                           boy                  28-JUN-10       7100

             1236 Ben                            IT                   28-JUN-10       3100         20

 

    --首先更新empno 为的salary ,并设置了一个保存点tran1     

       SQL> UPDATE scott.emp SET salary = salary * 1.5 WHERE empno = 1236;

 

       1 row updated.

 

       SQL> SAVEPOINT tran1;

 

       Savepoint created.

 

    --更新empno 为的salary

       SQL> UPDATE scott.emp SET salary = salary * 0.8 WHERE empno = 1235;

 

       1 row updated.

 

    --查看刚刚更新的两条记录

       SQL> SELECT * FROM scott.emp WHERE empno IN (1235,1236);

 

            EMPNO ENAME                          JOB              MGR HIREDATE      SALARY     DEPTNO

       ---------- ------------------------------ --------- ---------- --------- ---------- ----------

             1235 Tony                           boy                  28-JUN-10       5680

             1236 Ben                            IT                   28-JUN-10       4650         20

 

    --将事务回滚到保存点tran1

       SQL> ROLLBACK TO SAVEPOINT tran1;

 

       Rollback complete.

 

    --可以看到保存点之后的修改被回滚,而保存点之前的修改则不受影响

       SQL> SELECT * FROM scott.emp WHERE empno IN (1235,1236);

 

            EMPNO ENAME                          JOB              MGR HIREDATE      SALARY     DEPTNO

       ---------- ------------------------------ --------- ---------- --------- ---------- ----------

             1235 Tony                           boy                  28-JUN-10       7100

             1236 Ben                            IT                   28-JUN-10       4650         20

 

    --对所作的修改全部ROLLBACK,此时仅仅包含了empno 为的记录,因为已经被回滚

       SQL> ROLLBACK;

 

       Rollback complete.

 

       SQL>  SELECT * FROM scott.emp WHERE empno IN (1235,1236);

 

            EMPNO ENAME                          JOB              MGR HIREDATE      SALARY     DEPTNO

       ---------- ------------------------------ --------- ---------- --------- ---------- ----------

             1235 Tony                           boy                  28-JUN-10       7100

             1236 Ben                            IT                   28-JUN-10       3100         20

     

六、事务的开始与结束及不同时刻的状态

    事务的开始

       连接到数据并执行了一条DML语句(INSERT ,UPDATE,DELETE)

       前一条事务结束后,又执行了另外一条DML语句

    事务的结束

       执行COMMIT 或ROLLBACK

       执行DDL语句,则自动提交并结束事务

       执行DCL语句,则自动提交并结束事务

       断开与数据库的连接,如退出SQL Plus。

           Windows下SQL Plus正常退出将执行COMMIT,如点击关闭窗口直接关闭则回滚

           X-Window下SQL Plus正常退出将执行COMMIT,如点击关闭窗口直接关闭则回滚(笔者在RHEL5下测试如此)

       DML语句执行失败则自动回滚

 

    提交或回滚前的数据状态

       改变前的数据状态是可以恢复的

       执行DML 操作的用户可以通过SELECT 语句查询之前的修正

       其他用户不能看到当前用户所做的改变,直到当前用户结束事务。

       DML语句所涉及到的行被锁定,其他用户不能操作

 

    提交后的数据状态

       数据的改变已经被保存到数据库中。

       改变前的数据已经丢失。

       所有用户可以看到结果。

       锁被释放,其他用户可以操作涉及到的数据。

       所有保存点被释放。

 

七、并发事务

    多个用户同时与数据库交互,且每个用户都可以同时访问自己的事物,这种事务称为并发事务

    对于同一个对象上运行的多个事务,仅当执行commit时才对彼此的查询产生影响

   

下表中演示了并发事务的处理:


 


Trans1


Trans2


T1


SQL> SELECT COUNT(1) FROM emp;

 

  COUNT(1)

----------

        16


SQL> SELECT COUNT(1) FROM scott.emp;

 

  COUNT(1)

----------

        16


T2


SQL> INSERT INTO emp(empno,ename,salary)

  2  SELECT 6666,'Jenney',3000 FROM DUAL;


 


T3


SQL> UPDATE emp

  2  SET salary = salary + 200 WHERE ename = 'SCOTT';


 


T4


SQL> SELECT COUNT(1) FROM emp;

 

  COUNT(1)

----------

        17


SQL> SELECT COUNT(1) FROM scott.emp;

 

  COUNT(1)

----------

        16


T5


SQL> COMMIT;


 


T6


 


SQL> SELECT COUNT(1) FROM scott.emp;

 

  COUNT(1)

----------

        17

 

    示例中显示了两个不同的事务交叉执行的顺序,可以看出,仅当事务执行COMMIT后,相关事务才产生影响

 

 

 

八、利用AUTOCOMMIT进行事务控制

    SET AUTOCOMMIT ON

   

    设置自动提交,每执行一条语句,就提交。将autocommit设成ON时,在进行DML操作时似乎很方便,

    但在实际应用中有时可能会出现问题,如,在有些应用中要同时对几个表进行操作,对于这些表建立

    了外键联系,如果一旦操作失败另一个表,就很麻烦了。

 

       关于锁及事物的隔离级别请关注后续文章

时间: 2024-11-08 19:36:09

SQL基础15——数据库事务(TRANSACTION)的相关文章

SQL基础-->数据库事务(TRANSACTION)

--====================== --SQL基础-->数据库事务 --======================   一.数据库事务     数据库事务是指作为单个逻辑工作单元执行的一系列操作,可以认为事务就是一组不可分割的SQL语句     二.数据库事务的ACID属性     原子性(atomic)     事务必须是原子工作单元:对于其数据修改,要么全都执行,要么全都不执行.       一致性(consistent)     事务在完成时,必须使所有的数据都保持一致状态

MS SQL基础教程:事务复制

16.4.1 事务复制的特点 前面我们指出复制的本质就是从源数据库向目标数据库复制数据,但对不同的复制类型而言总是有差别的.从复制的具体内容来看快照复制是真正意义上的数据复制,不管采用何种数据接收方式(如将表删除后再重建或删除表中数据但保留表结构),在网络中传送的是数据.而事务复制在网络中传送的是事务(由一条或多条INSERT. DELETE. UPDATE):从传输的数据量来看,事务复制仅将发生的变化传送给订购者,是一种增量复制,但快照复制却将整个出版物复制给订购者. 由于事务复制要不断地监视

sql 数据库事务详解

sql 数据库教程事务详解 作为大型的企业级数据库,SQL Server2000对事务提供了很好的支持.我们可以使用SQL语句来定义.提交以及回滚一个事务. ??如下所示的SQL代码定义了一个事务,并且命名为"MyTransaction"(限于篇幅,本文并不讨论如何编写SQL语言程序,请读者自行参考相关书籍): DECLARE @TranName VARCHAR(20) SELECT @TranName = 'MyTransaction' BEGIN TRANSACTION @Tran

MS SQL基础教程:创建数据库

1.文件与文件组 在SQL Server 中数据库是由数据库文件和事务日志文件组成的.一个数据库至少应包含一个数据库文件和一个事物日志文件. (1) 数据库文件(Database File) 数据库文件是存放数据库数据和数据库对象的文件.一个数据库可以有一个或多个数据库文件,一个数据库文件只属于一个数据库.当有多个数据库文件时,有一个文件被定义为主数据库文件(Primary Database File), 扩展名为mdf, 它用来存储数据库的启动信息和部分或全部数据,一个数据库只能有一个主数据库

MS SQL基础教程:备份和恢复系统数据库

系统数据库保存了有关SQL Server 的许多重要数据信息,这些数据的丢失将给系统带来极为严重的后果,所以我们也必须对系统数据库进行备份.这样一旦系统或数据库失败,则可以通过恢复来重建系统数据库.在SQL Server 中重要的系统数据库主要有master. msdb. distribution. model. 虽然tempdb 也是系统数据库但没有必要对其进行备份,因为SQL Server 每次启动都会重新创建该数据库,而当SQL Server 停止运行时,tempdb 数据库中所有数据都会

数据库事务系列-事务模型基础

从这篇文章开始,笔者将会在接下来很长时间里整理记录一个相对独立的知识领域-数据库事务,之所以忽然有这个想法,说来也是一种机缘巧合.本来是单纯计划写写HBase行级事务模型的具体实现的,但是在周末一不小心看了HBasecon2017里面一个talk之后就一发不可收拾了.这个talk的主题是 Transactions In HBase(作者详细介绍了基于HBase实现的3种强一致性分布式事务模型-Tephra | Trafodian | Omid),里面提到了Google的Percolater,刚好

MS SQL基础教程:数据库索引

用户对数据库最频繁的操作是进行数据查询.一般情况下,数据库在进行查询操作时需要对整个表进行数据搜索.当表中的数据很多时,搜索数据就需要很长的时间,这就造成了服务器的资源浪费.为了提高检索数据的能力,数据库引入了索引机制.本章将介绍索引的概念及其创建与管理. 8.1.1 索引的概念 索引是一个单独的.物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单.索引是依赖于表建立的,它提供了数据库中编排表中数据的内部方法.一个表的存储是由两部分组成的,一部

《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——第2章 SQL Server和PowerShell基础任务2.1 介绍

第2章 SQL Server和PowerShell基础任务 PowerShell V3--SQL Server 2012数据库自动化运维权威指南 2.1 介绍 本章介绍使用PowerShell完成一些基本的SQL Server任务的脚本和代码片段.我们将从简单任务开始,例如,列出SQL Server实例,创建对象,如表.索引.存储过程和函数,让你轻松以编程方式使用SQL Server. 你会发现一些使用PowerShell和SQL管理对象(SQL Management Object,SMO)的方

《SQL入门经典(第5版)》一一第6章 管理数据库事务

第6章 管理数据库事务 SQL入门经典(第5版)本章的重点包括: 事务的定义用于控制事务的命令事务命令的语法和范例何时使用事务命令低劣事务控制的后果这一章将介绍数据库事务管理的概念.