引言
事务:一个或一组SQL语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。
I 事务
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个SQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一日执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态:如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
commit
、rollback
和savapoint
。
1.1 事务ACID特性
数据库运行的最小单元,是一系列的数据操作,是数据库应用程序的基本逻辑单元。事务是恢复和并发控制的基本单元。
- 原子性 atomicity
事务是数据库的逻辑工作单位,事务中包括的操作要么都做,要么都不做。
- 一致性 consistency
事务执行的结果必须是使数据库从一个一致性状态变换到另一个一致性状态。
- 隔离性 isolation
一个事务的执行不能被其他事务干挠。
- 持续性 durability
也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
1.2 事务的创建
- 隐式事务:事务没有明显的开启和结束的标记,dml执行会开启一个事务,ddl语句隐式的提交事务。
比如DML:insert、update、delete语句DDL: create、drop、truncate和alter
- 显式事务:事物具有明显的开启和结束的标记
通常事务以begin transaction
开始,以commit
或rollback
结束。
#开启事务
begin transaction
#编写一组事务的语句
#...
##结束事务
commit# 提交事务,当前操作会执行应用到数据库
rollback #事务恢复到上一个事务结束之前的状态。
commit
和rollback
会显式的提交事务
- 设置事务点 :
savepoint 事务点名;
- rollback 回滚事务,事务恢复到上一个事务结束之前的状态。
rollback to 事务点名;--在事务点之后的其他dml操作都会被取消
1.3 事务隔离级别
READ UNCOMMITTED
(读未提交数据): 允许事务读取未被其他事物提交的变更,脏读,不可重复读和幻读的问题都会出现READ COMMITED
(读已提交数据) :只允许事务读取已经被其它事务提交的变更,可以避免脏读,但不可重复读和幻读问 题仍然可能出现 。REPEATABLE READ
(可重复读) : 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事物对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在 。SERIALIZABLE
(串行化): 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作。所有并发问题都可以避免,但性能十分低下。
Oracle支持的2种事务隔离级别:READ COMMITED
,SERIALIZABLE
,Oracle 默认的事务隔离级别为: READ COMMITED
Mysgl支持4种事务隔离级别,Mysal 默认的事务隔离级别为: REPEATABLE READ
1.4 设置事物级别
查看事务级别:
select @@transaction_isolation;
设置事务级别
set @@transaction_isolation = 'repeatable-read';
set transaction isolation level repeatable read;
II 预备知识
2.1 oracle数据库的基本数据类型
number
数字类型varchar2
字符串类型;可变长char
字符串类型,固定长度,占用空间不变,执行效率高date
日期类型clob
字符型大数据类型blob
字节型大数据类型
2.2 mysql 各字段类型存储文本信息的最大值
text
,最大65535字节mediumtext
,最大16777215字节longtext
,2的32次方减1个,即4294967295个字节
2.3 DDL
create、drop、truncate和alter。
- 创建表
create table 表名(字段名 数据类型 约束,字段名 数据类型 约束);
- 复制表: 复制表只能复制表结构和数据,复制不了约束。
create table 表名1 as select * from emp where empno=10000;---如果where条件不成立,查不到任何东西时,该语句只复制了表结构;
注:user_constraints 存储当前用户的相关信息的数据字典
- 删除表:
drop table 表名
- 修改表
- 重命名:
rename 旧表名 to 新表名
- 修改表的字段名
alter table 表名 rename column 旧字段名 to 新字段名;
- 修改字段类型长度: 修改字段类型的前提是当前的字段值是空的,即修改的列为空。
alter table 表名 modify(字段名称 字段类型(长度));
- 添加字段:
alter table 表名 add(字段名称 字段类型(长度));
- 删除字段
alter table 表名 drop (字段名称);
alter table 表名 drop column(字段名称);
- 截断表 truncate: 删除表中的所有记录,效率比delete更高
2.4 DML
insert、delete、update。
- 添加记录: 字段的值与表中字段的类型和长度要匹配
insert into 表名(字段名称1,字段名称2) value(字段1的值,字段2的值);
一次插入多条记录
insert into emp(empno,ename) select empno,ename from emp;
- 修改记录:
update 表名 set 被修改的字段名1=新值,被被修改的字段名2=新值
- 删除记录:
delete 【from 】 表名;