数据库主要实现的功能无非是以下三点:
①数据的一致性,
②数据的安全,
③数据的优化。
事务主要影响数据的一致性。
1、事务的基本概念
一组DML语句 insert、delete、update
COMMIT;
ROLLBACK;
SAVEPOINT <savepoint_name>
ROLLBACK TO [SAVEPOINT] <savepoint_name>
SYS AS SYSDBA@ORCL>select * from t2;
ID NAME
---------- --------------------
1 r
2 rsc
2 beijing
3 china
Elapsed: 00:00:00.03
SYS AS SYSDBA@ORCL>insert into t2values(4,'qingdao');
1 row created.
Elapsed: 00:00:00.06
SYS AS SYSDBA@ORCL>select * from t2;
ID NAME
---------- --------------------
1 r
2 rsc
2 beijing
3 china
4 qingdao
Elapsed: 00:00:00.01
SYS AS SYSDBA@ORCL>savepoint x1
2 ;
Savepoint created.
Elapsed: 00:00:00.06
SYS AS SYSDBA@ORCL>insert into t2values(5,'shanghai');
1 row created.
Elapsed: 00:00:00.00
SYS AS SYSDBA@ORCL>rollback to x1;
Rollback complete.
Elapsed: 00:00:00.00
SYS AS SYSDBA@ORCL>select * from t2;
ID NAME
---------- --------------------
1 r
2 rsc
2 beijing
3 china
4 qingdao
Elapsed: 00:00:00.01
SYS AS SYSDBA@ORCL>commit;
Commit complete.
Elapsed: 00:00:00.01
SYS AS SYSDBA@ORCL>select * from t2;
ID NAME
---------- --------------------
1 r
2 rsc
2 beijing
3 china
4 qingdao
Elapsed: 00:00:00.04
事务的机制:(所有未提交的事务会被自动回滚)
当下如果有10条SQL语句,但只执行了5条语句,产生了8个脏块(其中6个日志已写入redo log文件中,还有2个在 log buffer中),这时数据库突然死机。当oracle数据库重新启动后,要进行实例恢复,跑日志,当所有的日志跑完后,当时写入redolog中的6个脏块被构造出来了。Oracle有一个原则,当一个会话死掉以后,这个会话所对应的事务不可能重现,也就是好,这个会话对应的事务不可能再完成了。所有这个事务只能被回滚。所以6个脏块会被自动被rollback,不会写入磁盘中。
2、隐式提交和回滚
DDL(执行之前将commit以上的事务,当执行完成之后也自动commit)
退出
异常退出(关闭ssh console端)
正常退出(exit)
正常退出和异常退出都会隐含提交。
做的任何DML操作都要显示的提交或者回滚。不要让Oracle隐式的提交或者回滚。
DDL隐式提交:
SYS ASSYSDBA@ORCL>select * from t2;
ID NAME
---------- --------------------
1 r
2 rsc
2 beijing
3 china
4 qingdao
5 jx
6 rows selected.
Elapsed: 00:00:00.09
SYS AS SYSDBA@ORCL>deletefrom t2 where id=1; #这里没有执行commit,也因ddl被提交了
1 row deleted.
Elapsed: 00:00:00.06
SYS ASSYSDBA@ORCL>create table t3(id int,name varchar2(20));
Table created.
Elapsed: 00:00:01.42
SYS AS SYSDBA@ORCL>select* from t2 where id=1; #被隐式提交
no rows selected
Elapsed: 00:00:00.04
EXIT隐式提交:
SYS AS SYSDBA@ORCL>select * from t2;
ID NAME
---------- --------------------
2 rsc
2 beijing
3 china
4 qingdao
5 jx
Elapsed: 00:00:00.04
SYS AS SYSDBA@ORCL>deletefrom t2 where id=5;
1 row deleted.
Elapsed: 00:00:00.00
SYS ASSYSDBA@ORCL>exit #这里退出sqlplus
[oracle@oracle ~]$ sqlplus / as sysdba #当再次登录的时候,已被隐式提交了
SYS AS SYSDBA@ORCL>select * from t2;
ID NAME
---------- --------------------
2 rsc
2 beijing
3 china
4 qingdao
Elapsed: 00:00:00.07
3、事务的含义
1.原子性(Atomicity)
事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的。
例如:A帐户向B帐户划账1000,则先将A减少1000,再将B增加1000,这两个动作要么都提交,要么都回退,不可能发生一个有效、一个无效的情况。
2.一致性(Consistency)
一致性是指数据库在事务操作前和事务处理后,其中的数据必须都满足业务规则约束。
例如:A、B帐户的总金额在转账前和转帐后必须一致,其中的不一致必须是短暂的,在事务提交前才会出现的。
再如:约定B帐户不能多于1000元,则A转出1000成功,B转入1000失败,最终由原子性得到——整个事务回滚
3.隔离性(Isolation)
隔离性是数据库允许多个并发事务同时对数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
例如:在A、B之间转帐时,C同时向A转帐,若同时进行则A、B之间的一致性不能得到满足。所以在A、B事务执行过程中,其他事务不能访问(修改)当前相关的数值。
4.持久性(Durability)
持久性表示为:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在提交之前如果系统故障,则所有信息全部丢失。提交之后数据存放在磁盘中,是永久性的。
4、事务的隔离级别
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
commit;
SET TRANSACTION ISOLATION LEVEL READ COMMITED;
SET TRANSACTION READ ONLY;
SET TRANSACTION READ WRITE;
查看事务的情况:
select xidusn,ubablk,ubafil from v$transaction;
查看当前会话的情况:
SYS AS SYSDBA@ORCL>select distinct(a.sid),a.serial#from v$session a,v$mystat b where a.sid=b.sid;
SID SERIAL#
---------- ----------
10 5
同一个用户名如果两次登录不同的终端,会话的serial#是不同的。所以不可能出现一样的会话。