什么是事务及其隔离级别和传播行为

1.什么是事务

事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割。

2.事务的特性

1)Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。(事务是应用中不可再分的最小执行体)

2)Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。在转账的时候不会出现一当少钱了,另一方没有增加的情况。(事务执行的结果,须使数据从一个一致性状态,变为另一个一致性状态)

3)Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。(各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的)

4)Durability(持久性):事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库。(事务一旦提交,对数据所做的任何改变都要记录到永久存储器中)

3.事务隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(读未提交) 、Read committed (读已提交)、Repeatable read(可重复读) 、Serializable (串行化),这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。

1)Read uncommitted(读未提交):该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。

2)Read committed (读已提交):该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。

3)Repeatable read(可重复读):该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别可以防止脏读和不可重复读。

4)Serializable (串行化):所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 在该隔离级别下事务都是串行顺序执行的,MySQL 数据库的 InnoDB 引擎会给读操作隐式加一把读共享锁,从而避免了脏读、不可重读复读和幻读问题。

什么是事务及其隔离级别和传播行为_第1张图片

 注:四种事务隔离级别从上到下,级别越高,并发性越差,安全性越来越高,一般默认隔离级别是读取已提交的数据(Oracle)或可重复读(MySQL)。

4.事务并发的问题

1)脏读:事务A读取事务B尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据<某一个事务, 读取了另外一个事务未提交的数据>

什么是事务及其隔离级别和传播行为_第2张图片

 2)不可重复读(前后多次读取,事务内容不一样):事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间 ,事物B进行了更改,事物A读取该条数据结果却不相同。<某一个事务, 对同一个数据前后读取的结果不一致>

什么是事务及其隔离级别和传播行为_第3张图片

3)幻读(前后多次读取,数据总量不一致):事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。<某一个事务, 对同一个表前后查询到的行数不一致

什么是事务及其隔离级别和传播行为_第4张图片

 5.事务的传播行为

1)什么是事务的传播行为

事务的传播行为,可以拆成两部分理解,即事务的传播,和事务的行为。指的是,当有两个或以上的方法同时声明为事务方法(事务方法:加了事物管理中的增删改方法)时,如果在一次程序执行过程中,这些事务方法彼此间相互调用。

事务的传播:指的是嵌套调用的多个事务方法,是否会共享同一个事务,即调用者所处的事务是否会传播给被调用者(前提:两者都是属于事务方法)。
事务的行为:主要指的就是事务的提交或者回滚。

2)事务的传播行为

  • required:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • supports:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • mandatory :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • requires_new:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • not_supported:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • never:以非事务方式运行,如果当前存在事务,则抛出异常。
  • nested:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 required

你可能感兴趣的:(数据库,java,开发语言)