事务产生的背景
当在PL/SQL中同时操作多个SQL语句,比如通过DML语句添加、修改或删除数据时,如何确保数据库数据不会因为意外而倒置错误数据是一个非常重要的问题。
以仓库发料系统为例,如果某一张领料单已经领了料,那么仓库中的物料就要减少,如果因为某些意外的原因,只是领料单的料数多了,而仓库中的物料没有减少,就会造成数据错误,使得整个仓库库管理系统数据变得混乱,进而影响到整个公司的运作。
数据库管理系统提供了事务处理的机制以确保数据的完整性和一致性。
事务(Transaction)是一个由多条SQL语句组成的工作逻辑单元,这些语句要么全部执行成功,要么全都不执行,只要有一条SQL语句执行失败,则已执行的SQL语句会回滚到执行之前的状态,这样就保证了数据库数据的一致性,不至于产生混乱的数据信息。
Oracle事务与SQL Server事务的区别
熟悉SQL Server的用户很快会发现,Oracle中的事务处理与SQL Server有较明显的区别。
在SQL Server中,每一个DML语句都具有一个隐式的事务,语句执行结束时事务被自动提交到服务器端,除非显式地通过一条事务语句开始一个事务。
而在Oracle中,当第一条SQL语句开始执行时,一个新的事务自动开始,除非显式地使用COMMIT进行提交,或者是使用ROLLBACK进行回滚,或者是退出某个Oracle工具时,这些事务才结束,否则SQL语句的操作仅在会话级别进行,并没有保存到数据库中。
事务的四个特性(ACID)
由于事务处理要确保事务内数据操作的一致性,因此一个事务必须要满足所谓的ACID,即原子性、一致性、隔离性和持久性这4个特性。
原子性(Atomicity)
事务必须是原子工作单元,对其进行的数据修改,要么全都执行,要么全都不执行。
以网上银行转账为例,要在A账户上增加1000元,同时要在B账户上减少1000元。要么同时执行,要么都不执行更改,以确保整个事务是一个原子工作单元。
一致性(Consistency)
事务在完成时,必须使所有的数据都保持一致状态,即所有的数据都要发生更改,以保证数据的完整性。在银行转账时,A账户和B账户的数据都要发生更改,以保证数据的完整性。
隔离性(Isolation)
两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时、运行中间某一时刻的数据。比如银行转账操作时,如果有其他的会话也在进行转账,那么当前事务内不能看到其他事务在运行时或运行中间某一时刻的数据。
持久性(Durability)
一旦事务被提交之后,数据库的变化就会被永远保留下来,即使运行数据库软件的机器后来奔溃也是如此。银行转账一旦操作完成,数据就会被永久地保留下来了,即使数据库系统关闭也不会丢失数据。