0 SQL类型
a) DML(Data Manipulation Lanuage 数据操作语言): select insert update delete
b) DDL(Data Definition Language 数据定义语言): create/alter/drop/truncate table;
create/drop view/sequence/index/synonym
c) DCL(Data Control Language 数据控制语言): commit rollback
1 基础概念
delete 和 truncate的区别:
a) delete逐条删除, truncate先摧毁表,在按照原来结构重建
b) delete是DML类型操作(可以回滚) , truncate 是DDL类型操作(不可以回滚)
c) delete操作不会释放表空间,原来有数据时多大执行delete后还是多大, truncate会释放表空间
d) delete会产生碎片,truncate不会
事务:
a) 起始于DML语句
b) 结束于提交: 显示-->commit
隐式-->1 正常退出exit 2 DDL语句(默认自带隐式提交)
回滚: 显示-->rollback
隐式-->停电,宕机,非正常退出
看如下示例,理解下回滚:
create table testsavepoint (tid number,tname varchar2(20));
insert into testsavepoint values(1,'Tom');
insert into testsavepoint values(2,'Mary');
savepoint a;
insert into testsavepoint values(3,'Moke');
select * from testsavepoint;
得到记录:
TID TNAME
---------- --------------------
1 Tom
2 Mary
3 Moke
rollback to savepoint a; 回滚到设置点
select * from testsavepoint;
TID TNAME
---------- --------------------
1 Tom
2 Mary
commit;
事务隔离级别:
隔离级别 | 描述 | 问题 |
read uncommitted读未提交数据 | 允许事务读取未被其他事务提交的变更
| 脏读/不可重复读/幻读的问题都会出现 |
read committed读已提交数据 | 事务只能读取被其他事务提交的变更 | 避免了脏读 不可重复读/幻读会出现 |
repeatable read可重复读 | 确保事务可以多次从一个字段中读取相同数值,在这个事务持续期间,禁止其他事务对此字段进行更新 | 避免了脏读/不可重复读 幻读会出现 |
serializable 串行化 | 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对此字段进行插入,更新,删除 | 性能低下 规避了所有问题 |
mysql支持以上所有隔离级别,默认的隔离级别为: repeatable read可重复读
oracle 支持2种离级别,read committed 和 serializable, 默认隔离级别为: read committed
事务分类两大类:
a) 本地事务 (常见开发中大多数都是本地事务)
eg:
try{
扣费
加费
提交
}catch(Exception e){回滚}
b) 全局事务 (JTA: java transaction api 这套java技术支持全局事务)
try{
扣费
加费
发送短信/邮件 (非数据库业务)
提交
}catch(Exception e){回滚}