oracle(24)_SQL_数据库事物
SQL
数据库事物
数据库事物
- 注意:本节使用的仍是上节复制的表 myemp!
范例:删除员工8001;
- 示例图:
从结果上看似乎数据已经删除,但是我们再打开另一个窗口查看发现 8001 的员工还在。
说明:
- 事务处理:所谓的事务管理就是要保证数据的完整性,要么同时成功,要么同时失败。
- 当我们执行完 delete 语句时,我们去数据库中去查看数据,发现并没有我们删除数据,这是因为oracle 的事务对数据库的变更的处理,我们必须做提交事务才能让数据真正的插入到数据库中,在同样在执行完数据库变更的操作后还可以把事务进行回滚,这样就不会插入到数据库。如果事务提交后则不可以再回滚。
- 提交:commit
- 回滚:rollback
范例:删除并提交
- 示例图:
范例:删除再回滚
- 示例图:
执行和回滚按钮
- 示例图:
数据安全问题
- 在 oracle 中会数据库变更会发生锁的情况(此处应用可以解决项目多线程并发带来的数据安全问题)当两个数据库的连接同时来修改同一数据时,一定会有一连接先修改,另一个连接就会等待直到第一个连接修改完毕再修改。
范例:数据库记录更新安全问题
- 示例图:
在窗口一当中更新数据,但不提交
上面的操作完成以后,同时在窗口二中对同一条数据进行更新操作,发现执行处于阻塞状态
当窗口一执行的操作提交以后,会发现窗口二的执行完成了
范例:带着事物查询
- 示例图:
在窗口一当中带着事物查询
同时在窗口二中也执行同样的查询语句,发现执行处于堵塞状态
当窗口一带着事物查询的的操作提交以后,窗口二的带着事物查询的语句才会被执行;同理,若窗口二带着事物查询的操作未提交,窗口一是不能再次执行刚才的查询操作的。
以上操作完整源码:
--增删改操作都要开启事务,事务必须提交我们的数据才会在数据库中真正的变更
delete from myemp t where t.empno = 8001;
--提交
commit;
--查询
select * from myemp;
--删除编号为 7369 的员工记录
delete from myemp t where t.empno = 7369;
--事务在没提交之前都可以回滚,提交了就不能回滚
rollback;
--查询
select * from myemp;
--执行 update 时没有提交之前事务是挂起状态,这时这条数据被锁住
update myemp t set t.sal = t.sal + 100 where t.empno = 7369;
--查询
select * from myemp;
--带着事物查询,此时别人是不能查询的
select * from myemp for update;
如有错误,欢迎指正!