事物
DTL:数据事务语言
就是指一组相关的SQL操作,我们所有的操作都是事务中的。执行业务中最基本的单位
事务的四大特性(ACID):
atomic,原子性,事务是不可分割的,要么同时成功,要么同时失败;
consistency,一致性,事务一旦结束,内存中的数据和数据库中的数据是保持一种; //
isolation,隔离性,事务之间互不干扰,一个事务的结束以为着下一个事务的开启;
duration,持久性,事务一旦提交,则数据持久化到数据库中,永久保存 // 一致性后的数据,会被永久保存在数据库中
在oracle中,操作事务的命令:
1.commit,提交事务
把事务中所有的数据持久化到磁盘中
2.savepoint 回滚点,设置回滚点
事务回滚时,回滚到起点
3.rollback to 回滚点,回滚事务 rollback 不接东西回滚到上一步
把事务中所做的操作全部取消,回到初始化状态
多事务并发
原因:多个事务同时操作一个表中的同一行数据,如果这些操作同时修改操作的话,就会产生并发问题,如果不处理,则会造成数据的不一致的情况
数据库可能产生的并发问题包括:
1.脏读
是指一个事务正在访问数据,并且对这个数据进行修改,而这种修改还没有提交到数据库中,而另一个事务也访问了这个数据,并且使用了这个数据。
解决方法:一个事务在修改数据时,该数据不能被其他事务访问
2.不可重复读:
是指一个事务多次读取同一条记录,如果此时另一个事务也访问并且修改了该数据,则就会出现多次读取出现数据不一致的情况,原来的数据变成了不可重复读取的数据。
解决方法:只有在修改事务完全提交过后才可以读取数据
3.幻读
是指一个事务修改表中的多行记录,但是此时另一个事务对该表格进行了插入数据的操作,则第一个事务会发现表格中会出现没有被修改的行,就像发生了幻象一样;
解决方法:在一个事务提交数据之前,其他事务不能添加数据
Oracle中采用‘锁’来做并发处理
1.表级排它锁(X) exclusive mode
2.表级共享锁(S) share mode
3.表中行级排它锁 share row exclusive
注:这三种锁是通过专门的命令来申请的
语法:
lock table tbl_name in mode;
例如:
--以共享锁锁表
lock table tbl_emp in share mode;
--以排它锁锁表
lock table tbl_emp in exlusive mdoe;
--------------------
4.行级共享锁(RS) row share
5.行级排它锁(RX) row exclusive
注:这两种锁无需通过专门的命令申请,而是通过DQL和DML来自动申请的
注意:
1.所有的DQL语句默认情况下都会自动申请RS锁
2.所有的DML语句默认情况下都会自动申请RX锁,每一行记录都会唯一的RX锁
3.在项目中,为了满足业务要求,一般select语句需要申请RX锁
select语句通过for update来申请RX锁:
select * from s_emp for update; 一直等待,直到另一个事务关闭
select * from s_emp for update wait 5;等待5秒
select * from s_emp for update nowait; 不等待,直接操作报错