预习事务处理
一 事务概念:由一组sql语句组成的一个逻辑工作单元
二 事务的属性:
2.1 原子性
一个事务是一个不可分割的逻辑工作单元,事务所包含的所有工作单元要么不做,要么全做
例如:银行转账业务。A向B转账,A的账户减少100,B账户增加100,这两个操作要么同事提交,要么都回退
2.2 一致性
系统在一个状态变换到另外一个状态,他们的一致性必须保持一直,事务总体上不能破坏特性环境下的任何业务规则
例如,在AB账户总金额在转账前后始终保持一致,只是有短暂的不一致。这个短暂时间发生在事务提交之前,事务提交
之后,保持一致。
2.3 隔离性
每个事务 都必须独立于其他业务执行
例如:活动事务所做的改变对并发运行的其他事务来说是不可见的,当A向B转账的同时,C向A转账,若同时进行,则A和B
之间的一致性不能满足。所以在AB事务执行过程中,其他事务不能访问当前相关的数值。
2.4 持久性
确保事务完成之后,对数据的修改是永久性的,即使发生系统故障也不会对其有影响、
例如:当AB转账完成事务提交之后,就算系统故障,数据已经被修改,转账已经成功、
注意:关于隔离性所引起的几个问题
1 更新结果丢失、在oracle默认级别下,该情况不会发生
事务1----- 更新数据 2000+200
事务2 ----- 更新数据(读取的是没有更新的结果)2000+200
事务1----- commit 2200
事务2 ---- commit 2200
本来结果应该为2400 ,但是现在只有2200,出现更新结果丢失
2 脏读 在oracle默认级别下,该情况不会发生
事务1 ---更新数据:2000+200
事务2 --更新数据:查询到的数据为2000,实际上已经为2200了,只是事务1没有提交,导致事务2读取的数据错误
事务2--commit
事务1 ---commit
3 不可重读
解释:事务1----查询数据
事务2---修改数据
事务2---commit
事务1----查询数据
此时会发现事务1中发生两次查询数据不同(数据内容上的不同天)
4 幻读
事务1 ----查询数据
事务2 ----添加或者删除(insert delete)
事务2 ----commit
事务1-----查询数据
事务1中两次查询数据条目不同
三 基本的事务处理
3.1 开始事务
在oracle中默认状态下,事务是自动启动的,不需要在代码中手动定义,(当我们执行第一句sql代码时,事务自动开启)
3.2 执行sql语句
如果有多条执行语句组成一个事务。那么必须待所有sql都执行成功,那么表示事务可以被提交,否则事务要进行回滚。
3.3 提交事务
如果事务中的所有sql都执行成功,可以通过执行commit提交事务
语句:
commit;
3.4 注意:以下情况会自动提交事务
1 当执行ddl语句时将会自动提交事务。例如 create table alter table 以及drop table
2 当执行dcl表,
3 当oracle服务被关闭的时候。
四 隔离级别
4.1 未提交读 (Read Uncomited)oracle中最低最危险级别,无法避免脏读现象,但是不允许数据更新丢失
4.2 提交读(Read Commited)是大多数数据库系统的默认级别。可以避免脏读现象,但是不可避免重复读
4.3 可重复读取(Repeatable Read)可以避免可重复读取和脏读,但是不可避免幻读。
4.4 可串行读(Serializable Read)要求事务按照顺序执行,确保事务不被干扰,但是并发性低
五 数据库中的锁
(一) 锁的种类
5.1 行级共享锁(RS row share):一个用户使用共享锁锁定某一行之后,其他用户也可以对相同列加上共享锁
加锁之后,可以查询该行,但是不能修改该行的数据。
5.2 行级排他锁(RX row exclusive):只允许某一用户对其加锁,其他用户不能再锁定。
用法 :for update
通过for update 给sql语句添加排它锁
例如:select * from emp where empno = 7369 for update;用于锁住编号为7369的一行数据,
此时,另外的用户来修改该行数据,则会一直等待该条数据释放锁,然后执行修改语句,但是某些
情况下,用户不希望等待太长时间,这时,可以设定等待时间或者设置不等待
update set sal = 1000 where empno = 7369 nowait设置不等待模式
update set sal = 1000 where empno = 7369 wait 10 设置等待10秒
如果在十秒之后,锁还没有被释放,则停止等待。
5.3 共享锁 (S share):和行级享锁差不多,只是共享锁锁住的对象是整个表。例如
lock table tableName in share mode
5.4 共享更新锁 (in share update mode)
5.5 排他模式 :只允许某一用户对其加锁,其他用户不能再锁定。不允许其他用户插入、更新和删除行,允许其他表插入数据,
(二)锁的级别
行级锁:也称事务所,该锁从事务被创建开始,事务提交或者回滚释放。行级锁可以锁定某一行数据
表级锁:
备注:相应的操作自动产生锁的对象关系
1 在执行insert update delete语句时,自动产生行级排他锁
2 在执行create语句时候,自动产生共享锁(S锁)
3 在执行alter语句的时候,自动产生排他锁