Spring事务 - 01.概述及特性

一.什么是事务?

事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。 

例如:张三要给李四转账1000元,假设他们两个的账户里面现在都是2000元,那么现在就需要进行两个操作:

  • 修改张三账户,-1000
  • 修改李四账户,+1000

正常情况下应该是张三的账户变为1000元,李四的账户变为3000元;但是有时候可能会在转账过程中出现断电或者其他异常,导致张三钱转出去了,李四没有收到,张三损失了1000元。

所以这组操作可以用一个事务来进行管理,如果一旦被加入到事务中,那么这两个操作就必须一起成功或者一起失败。

二.事务的四大特性

1.原子性

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

在物理中,原子是最小的单位,是不能再被分割的。所以事务中的操作也不能单独拿出来运行,因为单独运行可能就会导致错误或者失败。

2. 一致性

一致性是指事务前后数据的完整性必须保持一致。

也就是说在事务执行之前,张三账户有2000元,李四账户也有2000元,一共是4000元;当转账完成之后,张三的账户是1000元,李四的账户是3000元,加起来总共也是4000元。

3.隔离性

隔离性是指多个用户并发访问数据库的时候,一个用户的事务不能被其他用户所干扰,多个并发事务之间的数据要互相隔离。

假设有两个事务在同时操作数据库,A事务正在修改张三的信息,B事务也进来修改张三的信息,最后修改完成之后会导致张三的信息被重复修改,或者A事务改完的信息被B事务给覆盖了。所以为了避免一个事务在执行过程中受到其他事务的干扰,可以通过设置数据库中相应的事务隔离级别来解决。

如果不考虑隔离性,可能会引发以下问题: 

  1. 脏读:一事务对数据进行了增删改,但未提交,另一事务可以读取到未提交的数据。如果第一个事务这时候回滚了,那么第二个事务就读到了脏数据。 
  2. 不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的。
  3. 幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。
  4. 丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。

4.持久性

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。

如果事务还没有提交,那数据其实还没有修改到数据库。

发布了46 篇原创文章 · 获赞 0 · 访问量 2041

猜你喜欢

转载自blog.csdn.net/hon_vin/article/details/101753056