16-Oracle入门之数据库事务
2017-01-08 13:30
190 查看
基本概念
数据库事务由以下的部分组成:一个或多个DML 语句
一个 DDL语句
一个 DCL语句
以第一个 DML 语句的执行作为开始:oracle默认事务似是打开的, 但是不自动提交 ,mysql自动提交 。
以下面的其中之一作为结束:
提交:
显示结束: commit
隐式结束(自动提交): DDL语言,DCL语言, exit(事务正常退出)
回滚:
显示:rollback
隐式 (系统异常终止): 关闭窗口,死机,掉电
特点 要么都成功,要么都失败
特性 原子性 一致性 隔离性 持久性
事物的隔离性 多个客户端同时操作数据库的时, 要隔离他们的操作
否则:脏读 不可重复读 幻读
设置不同的隔离级别来解决
COMMIT和ROLLBACK语句的优点
确保数据完整性。数据改变被提交之前预览。
将逻辑上相关的操作分组。
控制事务
回滚到保留点
使用 SAVEPOINT 语句在当前事务中创建保存点。使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。
UPDATE... SAVEPOINT update_done; Savepoint created. INSERT... ROLLBACK TO update_done; Rollback complete.
事务进程
自动提交在以下情况中执行:DDL 语句。
DCL 语句。
不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话exit。
会话异常结束或系统异常会导致自动回滚。
提交或回滚前的数据状态
改变前的数据状态是可以恢复的执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
DML语句所涉及到的行被锁定, 其他用户不能操作。
数据的改变已经被保存到数据库中。
改变前的数据已经丢失。所有用户可以看到结果。
锁被释放, 其他用户可以操作涉及到的数据。
所有保存点被释放。
提交数据
改变数据DELETE FROM employees WHERE employee_id = 99999; 1 row deleted. INSERT INTO departments VALUES (290, 'Corporate Tax', NULL, 1700); 1 row inserted.
提交改变
COMMIT; Commit complete.
数据回滚后的状态
使用 ROLLBACK 语句可使数据变化失效:* 数据改变被取消。
* 修改前的数据状态被恢复。
* 锁被释放。
DELETE FROM copy_emp; 22 rows deleted. ROLLBACK; Rollback complete.
create table testsavepoint (tid number, tname varchar2(20)); set feedback on insert into testsavepoint values(1, 'tom1'); insert into testsavepoint values(2, 'tom2'); savepoint a; //创建一个保存点 insert into testsavepoint values(3, 'tom3a); rollback to savepoint a;
注意: 回退到savepoint a 前面插入的两条sql语句还没有提交; 仍然还在一个事务里面;让事务结束的方法:commit,rollback以及使用DDL语句和其他形式的退出:
SQL> rollback / commit
语句 | 功能 |
---|---|
INSERT | 插入 |
UPDATE | 更新 |
DELETE | 删除 |
COMMIT | 提交 |
SAVEPOINT | 保存点 |
ROLLBACK | 回滚 |
数据库的隔离级别
对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱
数据库提供的 4 种事务隔离级别:sql99
Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED
实际上还有一种是readonly,所以Oracle支持的隔离级别应该是3种!数据库几乎不做串行化操作,增加了read only。
Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ
相关文章推荐
- 在 .NET 中使用 Oracle 数据库事务
- ORACLE数据库事务处理和故障恢复
- C#.NET执行Oracle DBLink关于“ORA-02041: 客户数据库未开始一个事务处理”
- 正好整理了一下,自己做了个连接数据库的组件,支持SQLSERVER,ACCESS,ORACLE,FoxPro,MySql,IBM DB2,DBF等数据库,并且支持事务处理
- 软件编程走火入魔之:数据库事务处理入门(适合初学者阅读)
- ORACLE入门之改数据库的归档方式
- 《微型电脑应用》2011年第11期刊登出《万能数据库查询分析器中的事务管理在Oracle中的应用》
- SQL Server与Oracle数据库事务处理横向对比
- SQL 和Oracle对数据库事务处理的差异性
- 数据库编程实战:Oracle PL/SQL入门之案例实践
- 初识jdbc对oracle数据库事务处理(隔离级别)
- oracle分布式处理时报“ORA-02041: 客户数据库未开始一个事务处理”解决办法 - z
- 在 .NET 中使用 Oracle 数据库事务(转载)
- SQL 和Oracle对数据库事务处理的差异性
- 在 .NET 中使用 Oracle 数据库事务(学习)
- Oracle数据库事务处理和故障恢复
- 在 oracle 数据库上构建 .NET程序以及数据库连接事务说明
- PowerDesigner入门一:Oracle、MSSQL2000导出数据库结构到PowerDesigner
- oracle 数据库事务
- 《微型电脑应用》2011年第11期刊登出《万能数据库查询分析器中的事务管理在Oracle中的应用》