EJB学习笔记之八(通俗易懂数据库中的事务)

 

 1.事务概念

事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。

通俗的说的话,事务就是一件事情,要么成功执行到底,要么回到起点,什么都不做。

事物的特性(ACID)

原子性(Atomicity):正如原子时自然界最小颗粒,具有不可再分的特征一样。意思就是说,咱的事务是一个逻辑单元,不能再拆分了,比如整体的执行。

一致性(Consistency):事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。比如说银行之间的转账,从A账户向B账户转入1000元。系统先减少A账户1000元,然后再为B账户增加1000元。如果全部执行成功的话,则数据库就处于一致性状态。如果仅仅A账户金额修改,B账户没有增加的话,那么数据库就处于不一致的状态。因此,一致性必须通过原子性来保证。

隔离型(Isolation):各个事务执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的。也就是说,并发执行的事务之间不能看到对方的中间状态。并发事务之间是不能互相影响的。

持久性(Durability):事务一旦提交,对数据所做的改变都要记录到存储器中,通常就是保存进物理数据库。


 2.隔离性带来的并发问题

由于各个事务之间可能出现并发访问的问题,因此隔离性将会带来脏读、不可重复读、虚度、丢失更新的问题。

脏读:一个事务读取了另一个事务未提交的数据。

例如,小明去银行取钱,她老婆呢此时正在通过支付宝转账。她老婆查出来的钱为2000,于是,转走1000,但是还没有提交事务,小明此时过来查出来的钱为2000,于是这2000就为脏数据。整个过程中,她老婆的事务过程包裹这小明的事务过程,但是并未执行完全,因此导致了脏数据的产生。

不可重复读:一个事务中连续读取两次,第二次读取另一个事务已经提交Update修改的数据(数据改变),两次读取到的数据不一致。

还是紧接着上述的例子,小明首先查出来的钱为2000,此时她老婆转走1000,并且她老婆的事务提交,完成。当小明取完钱后,再看了一下自己的账户余额,发现为何不是1000,而是0呢?因此两次读取的数据不一致。导致了不可重复读的产生。

幻读:一个事务读取另一个事务已经提交插入的数据(Insert),因此记录条数已经改变。

比如有一张学生信息的表,统计这全班男女的学生信息,此时我正在通过SQL语句,查询男学生的个数,有一个同学向库里面又插入了一条男同学的信息,当我第二次再次查询的时候,多出一条,导致了幻读的产生(Insert)


 3.数据库的隔离级别

为了解决上面隔离性带来的问题,于是出现了隔离级别的概念,首先不是所有数据库都支持这四种级别,

1.Read_Uncommited:读取未提交,引发所有隔离问题。上面四个问题并未解决。

2.Read_Committed:读已提交,防止了脏数据的产生,但是会产生不可重复读和幻读。

3.Repeatable_Read:重复读,阻止脏读,不可重复读,发生幻读的问题。

4.Serializable:串行处理,不允许两个事务,同时操作一个目标数据,根本不存在并发问题。因此效率和性能低下。


企业开发过程中,主要是Read_Committed(Oracle默认级别)、Repeatable_Read(MySQL默认级别)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值