事务概念
作为单个逻辑工作单元执行的一系列操作。
比如张三向李四转账1000,那么张三钱数-1000,而李四+1000;
事务特性:ACID
Atomicity原子性:要么都成功,要么都失败;
Consistency一致性:事务执行前后,总量保持一致;
Isolation隔离性:各个事务并发执行时,彼此独立;
Durability持久性:持久化操作。
事务的生命周期:
MySQL:自动提交;
Oracle:手工提交。
1 事务开始标志:第一条DML,增删改;
既当执行DML语句,开启事务操作。
2 事务的中间过程:各种DML操作;
3 事务的结束标志包括两种情况
a 提交:
显示提交:commit: 提交当前事务或有问题的事务
隐示提交:自动提交,正常退出exit、DCL(grant…to…,revoke…from…),DDL(创建表create,drop)
b 回滚:
1 显示回滚:rollback: 撤销 当前事务或有问题的事务
2 隐士回滚:异常退出(断电);
--查询emp表
SQL> select *from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 1200 20
7499 ALLEN SALESMAN 7698 20-2月 -81 2000 300 40
7521 QINJIALI_3 SALESMAN 7698 22-2月 -81 1650 500 30
7566 JONES MANAGER 7839 02-4月 -81 4575 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1650 1400 40
7698 BLAKE MANAGER 7839 01-5月 -81 4450 30
7782 CLARK MANAGER 7839 09-6月 -81 4050 10
7788 SCOTT ANALYST 7566 19-4月 -87 3400 20
7839 KING PRESIDENT 17-11月-81 7000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1900 30
7876 ADAMS CLERK 7788 23-5月 -87 1500 20
7900 JAMES CLERK 7698 03-12月-81 1350 30
7902 FORD ANALYST 7566 03-12月-81 3400 20
7934 MILLER CLERK 7782 23-1月 -82 1700 10
已选择14行。
--更新数据
SQL> update emp set ename='QIN_JIALI' where empno=7521;
已更新 1 行。
SQL> select *from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 1200 20
7499 ALLEN SALESMAN 7698 20-2月 -81 2000 300 40
7521 QIN_JIALI SALESMAN 7698 22-2月 -81 1650 500 30
7566 JONES MANAGER 7839 02-4月 -81 4575 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1650 1400 40
7698 BLAKE MANAGER 7839 01-5月 -81 4450 30
7782 CLARK MANAGER 7839 09-6月 -81 4050 10
7788 SCOTT ANALYST 7566 19-4月 -87 3400 20
7839 KING PRESIDENT 17-11月-81 7000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1900 30
7876 ADAMS CLERK 7788 23-5月 -87 1500 20
7900 JAMES CLERK 7698 03-12月-81 1350 30
7902 FORD ANALYST 7566 03-12月-81 3400 20
7934 MILLER CLERK 7782 23-1月 -82 1700 10
已选择14行。
--回滚
SQL> rollback;
回退已完成。
SQL> select *from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 1200 20
7499 ALLEN SALESMAN 7698 20-2月 -81 2000 300 40
7521 QINJIALI_3 SALESMAN 7698 22-2月 -81 1650 500 30
7566 JONES MANAGER 7839 02-4月 -81 4575 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1650 1400 40
7698 BLAKE MANAGER 7839 01-5月 -81 4450 30
7782 CLARK MANAGER 7839 09-6月 -81 4050 10
7788 SCOTT ANALYST 7566 19-4月 -87 3400 20
7839 KING PRESIDENT 17-11月-81 7000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1900 30
7876 ADAMS CLERK 7788 23-5月 -87 1500 20
7900 JAMES CLERK 7698 03-12月-81 1350 30
7902 FORD ANALYST 7566 03-12月-81 3400 20
7934 MILLER CLERK 7782 23-1月 -82 1700 10
已选择14行。
保存点 savepoint:
语法:
当执行rollback时,通过指定保存点可以回退到指定的点。
回退事务的几个重要操作
1.设置保存点 savepoint 保存点名
2.取消保存点a之后事务 rollback to 保存点名
3.取消全部事务 rollback
注意:这个回退事务,必须是没有commit前使用的;
SQL> create table student(stuno number,stuname varchar2(20));
表已创建。
SQL> insert into student values(12,'QINJIALI');
已创建 1 行。
SQL> insert into student values(13,'QINWENXI');
已创建 1 行。
SQL> select *from student;
STUNO STUNAME
---------- --------------------
12 QINJIALI
13 QINWENXI
SQL> savepoint hello;
保存点已创建。
SQL> insert into student values(14,'张飞');
已创建 1 行。
SQL> select *from student;
STUNO STUNAME
---------- --------------------
12 QINJIALI
13 QINWENXI
14 张飞
SQL> rollback to savepoint hello;
回退已完成。
SQL> select *from student;
STUNO STUNAME
---------- --------------------
12 QINJIALI
事务的隔离级别:
一个事务对数据库的修改与并行的另一个事务的隔离程度。
首先介绍一下,事务带来的问题:
1 脏读:当一个事务正在访问数据,并对此数据进行了修改(1–>2),但是这种修改还没有提交到数据库(commit);此时,另一个事务也在访问该数据。本质:某个事务(客户端)读取的数据是过时的(另一个事务还没有commit)。
简单说:一个客户端读取的是旧数据;
2 不可重复读:在一个事务(客户端)内,多次读取同一个数据,但是结果不同。 本质:就是事务A拿到了被其他事务B修改并提交后的数据。
3 幻读(虚读):在一个事务(客户端)内,多次读取同一批数据,但是结果不同。
从操作语句来区分:
不可重复读:update
幻读:insert,delete
隔离级别:
四种类隔离级别的程度是依次递进(解决并发的效果,越来越稳定),但是性能越来越低,并发性、可用性本身就是矛盾的。
oracle只支持两种:Read Committed(默认),Serializable(序列化,并行化)
(oracle自身扩充了一种read only,实际隶属于Serializable级别);
切换隔离级别:
set transaction isolation level Serializable;
SET TRANSACTION READ ONLY;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;