事务的基本概念
一组DML语句 insert\delete\update
COMMIT
ROLLBACK
SAVEPOINT
ROLLBACK TO [SAVEPOINT]
export NLS_LANG=american_america.zhs16gbk
问题:有些时候使用其他用户登录数据库的时候,会显示提示用户被说锁住,解决办法:
alter user hr account unlock identified by hr;---使用sys用户登录将hr解锁并将密码修改为hr,下次在登陆时就不会报错了。
事务的开启
select * from user_tables;
select table_name from user_tables;
select * from t1;
什么叫开始事务?
一个会话登陆以后,执行的第一条DML语句就是开启一个事务。
查看是否开启事务?
select xidusn,ubablk,ubafil from v$transaction;
执行一条插入语句
insert into t1 values(2,'lqq');
此时事务开启,查看一下
之后再执行一些DML语句,此时这些语句就构成了一个事务。
事务的结束
当所有的DML语句执行结束后,使用commit,来将所有的操作进行提交,以为当前所有的操作将被永久保存,意味着一个事务的结束。
如果使用rollback,代表之前所做的所有操作都将被回滚到没有操作之前。代表事务结束
一个事务结束也意味着可以开启一个新的事务。
事务的回滚
savepoint x1;---设置回滚点
一个事务可以回滚到指定位置
假设:
对数据库进行非常大的批处理操作,为了执行可以成功,每一千条设置一个回滚点,当语句出现问题,就可以根据回滚点回滚到制定位置,不需要全部回滚。在实际的生产中是比较常用的。
每一个会话登入数据库都有一个sessionID
一个会话关闭后,即使是同样的人,使用同样的电脑和同样的账号登录数据库,也不可能恢复之前的上一个对话,而是重新的开启了一个新的会话。
一个会话关闭后意味着在当前会话中未执行的事务也不能进行恢复了。因为事务所依赖的会话已经死掉了。
数据库运行期间,一个会话登录,会话执行一个具有10条DML语句的事务,但是只执行了5条,产生了八个脏块,有六块脏块对应的日志已经写入磁盘,但是有两个还在logbuffer中,这时数据库崩溃后重启,重启以后oracle会跑日志,其中6块脏块被构造出来。但是有一个问题存在的是,一个会话结束后,这个会话是不能再生的,也就意味着之前没有完成的事务是不能再次完成了。这时事务只能回滚,oracle会自动将事务回滚。也就是说在这个会话中,被恢复的六块数据也会自动被回滚。
所以当数据库崩溃后,会发生前滚,而有未完成的事务,则会发生回滚。
对于Oracle来讲,一个事务要么全成功要么全失败。不可能出现一个事务运行一半的时候被保存可以访问的情况。
隐式的提交和回滚
事务回滚情况:1.rollback
2.数据库崩溃,自动回滚
事务提交情况:
3.在执行DDL语句之前,oracle会自动将事务进行commit,在执行完DDL
以后也会执行commit(DDL包括create )
4.当开启一个事务后,关闭会话,打开另一个会话,再去查询,发现事务是已经提交的,也就是说关闭会话也以为事务的提交。
5.异常退出,也是会导致事务的提交。在windows环境下也有可能回滚有可能自动提交。
delete from t1 where id=1;
create table t2(id int,name varchar2(20));
查看执行t1
rollback后,查看t1
证明DDL语句前后都有一个隐形的提交commit
为了避免隐式的提交和回滚,都要显示的回滚,也就是在执行事务的时候,要么立刻提交要么立刻回滚。