Oracle数据库事务

一、事务

1.事务(Transaction)是用户定义的一个操作序列,这些操作要么全部成功要么全部失败,是一个不可分割的工作单位(构成单一逻辑工作单元的操作集合) 。

2.如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。

3.如果事务遇到错误且必须取消或回滚,则所有更改均被清除。

二、事务的特性(ACID)

1.原子性 Atomicity

事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。

2.一致性 Consistency

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,系统将事务中对数据库的所有已完成的操作全部撤消,回滚到事务开始时的一致状态。

3.隔离性 Isolation

一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

4.持久性 Durability

持久性也称永久性(Permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。

三、数据库事务

1.事务是由任意数量的数据操作语句(INSERT、UPDATE、DELETE)组成的一个逻辑工作单元,不能分割,对数据的更新要么一起成功提交,要么全部回滚撤销 。

2.在同一个会话中执行的 DML 语句可以立即查看到执行的结果,但在提交(COMMIT)之前,其他会话不会查看到对数据的修改。

3.在 Oracle 中事务不需要明确的开始,当进行提交或回滚后事务结束,下一个事务自动开始 。

4.与数据库事务相关的 SQL 语句包括:

①COMMIT:提交当前事务

②ROLLBACK [ TO  SAVEPOINT <保存点名>]:回滚、撤销当前整个事务,或回滚、撤销至指定保存点之后的操作

③SAVEPOINT:在当前事务中设置保留点,用于在较长的事务期间中有选择的撤销部分操作。

5.事务的工作方式

①创建事务: 启动事务后把所有后继的SQL语句看作事务的组成部分,直到提交或回滚事务为止。

②提交事务: 提交事务后,事务结束,事务期间对数据库所做的任何修改将应用到数据库,事务结束。

③回滚事务: 回滚事务后,事务结束,放弃事务期间所做的任何修改,事务结束。

四、事务的并发

如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。并发问题包括:

①脏读(读取了未提交的数据)

②非重复读(读取同一行数据不一致)

③幻像读(读取数据行数不一致)

五、事务的并发控制

1.当许多用户试图同时修改数据库内的数据时,必须控制系统以使某个用户所做的修改不会对他人产生负面影响。这称为并发控制。

2.并发控制理论因并发控制的方法不同分为两类:

①悲观并发控制    锁定系统阻止用户以影响其它用户的方式修改数据。如果用户执行的操作导致应用了某个锁,则直到这个锁的所有者释放该锁,其它用户才能执行与该锁冲突的操作,该方法主要用在数据争夺激烈的环境中。

②乐观并发控制    在乐观并发控制中,用户读数据时不锁定数据。在执行更新时,系统进行检查,查看另一个用户读过数据后是否更改了数据。如果另一个用户更新了数据,将产生一个错误。一般情况下,接收错误信息的用户将回滚事务并重新开始。该方法主要用在数据争夺少的环境内 。

六、事务的隔离级别

隔离级别是一个事务必须与其它事务进行隔离的程度,即事务准备接受不一致数据的级别。较低的隔离级别可以增加并发,提高效率,但代价是降低数据的正确性。

七、死锁

为尽可能避免死锁的发生,用户应该遵循以下原则:

  1. 在所有的事务中都按同一顺序来访问各个表。
  2. 尽可能利用存储过程来完成一个事务, 以便能保证对各表的访问次序都是一致的。
  3. 事务应该尽量小且应尽快提交。
  4. 尽量避免人工输入操作出现在事务中。

尽量避免同时执行诸如【INSERT】、【UPDATE】和【DELETE】等数据修改语句。 

八、JDBC的事务管理

1.在JDBC的数据库操作中,一项事务是由一条或多条表达式所组成的一个不可分割的工作单元。我们通过提交commit()或是回退rollback()来结束事务的操作。关于事务操作的方法都位于接口java.sql.Connection中。

2.在JDBC中,事务操作默认是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作。操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回退。

3.在JDBC中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交。倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常。此时就可以在异常捕获时调用rollback()进行回退。这样做可以保持多次更新操作后,相关数据的一致性。  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值