数据库事务
永久性记录事务中SQL语句的结果,需要执行commit语句,从而提交事务,要取消SQL执行的结果,需
要执行ROLLBACK语句从而回滚事务,将所有行重新设置为原始状态
事务的开始与结束
事务是用来分割SQL语句的逻辑工作单元,事务有起点也有终点;
1、连接到数据库,执行一条DML语句(INSERT,UPDATE,DELETE)
执行COMMIT或ROLLBACK,事务结束
2、执行DDL语句如(CREATE TABLE..会自动执行commit;
3、执行一条DCL语句(GRANT,,自动执行COMMIT;
4、断开与数据库连接,会自动执行commit;
5、若数据库出现异常,则会自动执行ROLLBACK;
保存点
在事务中设置保存点,这样可以将修改回滚到保存点处。
事务的ACID特性
原子性(Atomic) :一个事务中包含的所有SQL语句都是一个不可分割的单元。
一致性(Consist) : 事务必须确保数据库的状态一致。
隔离性(Isolated) : 多个事务可以独立运行,彼此不影响
持久性(Durable) : 事务一旦提交,数据库的变化会永久保留下来。
并发事务
Oracle数据库支持多个用户同时与数据库进行交互,这种同时运行的事务交并发事务(Concurrent
transaction).
两个同时运行的事务只有在其中一个执行commit语句后才会对另一个获取的内容产生影响。
事务锁
当事务1对某条数据执行修改操作,但是没有执行commit语句,这时事务1已经对该条数据上锁,事务
2必须等到事务1 执行commit以后,释放锁,才能对该条数据执行修改或删除操作。
事务隔离级别(transaction isolation level)
T1代表事务1,T2代表事务2
幻像读取(phantom read) T1读取一条指定where条件的数据,T2插入一行记录,且该记录满足
T1where条件,T1再次检索,可以看到T2新增的行。
不可重复读取(nonrepeatable read)T1读取一行,T2修改了T1读取的数据,T1再次读取,数据变化。
脏读(dirty read)T1更新记录,未提交,T2读取该记录,T1执行回滚,T2读取的行无效
隔离性级别从低到高:
READ UNCOMMITTED:允许,幻像读取,不可重复读,脏读
READ COMMITTED:允许,幻像读取,不可重复读取
REPEATABLE READ:允许幻像读取
SERIALIZABLE:均不允许
查询闪回:
如果错误的提交数据,并想查看被秀该行原来的值,可以使用查询闪回(query flashback),执行这种
操作必须有execute权限
再次使用闪回操作时,必须先禁用