Spring中的事物属性

事物的特征

  • 原子性:要么全部执行,要不全部不执行
  • 一致性:数据库从一个一致性状态变成另一个一致性状态
  • 隔离性:事物间不能互相干扰
  • 持久性:一旦事物提交,将永远持久化到数据库存储

事物的属性

  • 隔离属性
  • 传播属性
  • 只读属性
  • 超时属性
  • 异常属性

隔离属性:解决高并发场景下容易发生的脏读、幻读、不可重复无问题。

脏读:两个事物,t1,t2;t1对工资进行了修改,由原来的5000调整为8000,但还未提交,此时t2对工资进行了查询,得到的结果是8000,此时t1要进行事物提交,但是发生了异常,数据回滚到了5000,此时t2获取到的就是t1未提交的脏数据,简称脏读。
不可重复读:两个事物,t1,t2;t1获取工资为5000,此时t1事物还未提交,t2事物对工资进行了调整为8000,并且进行了提交,此时t1事物再次获取工资时发现与上一次获取的数据结果不一致,这就造成了不可重复读。(注意是同一个事物中,多次获取的数据结果不一致)
幻读:两个事物,t1,t2;t1根据sql查询10条记录,此时t1还未提交,t2在表中新增了两条数据,并且提交了,此时t1事物再次获取数据时,发现多了两条(什么情况?),此时就发生了幻读(注意也是在同一个事物中,多次获取数据的条数不一致)

隔离属性主要分为以下几种

  1. isolation=READ_COMMITTED:只可以读取已提交的事物,解决脏读问题
  2. isolation=REPEATABLE_READ:行锁:当事物操作某一个数据时,会锁定当前行,其他事物进入一个等待阶段,解决不可重复读问题
  3. isolation=SERIALIZABLE:表锁:当事物操作某一张表时,锁定当前表,其他事物如想查询该表数据需要等待之前的事物提交,解决幻读问题

MYSQL默认隔离级别:REPEARABLE_READ
ORACLE默认隔离级别:READ_COMMITTED,不支持REPEATABLE_READ

传播属性:解决事物嵌套的问题,外部大的事物包含很多小事物,小的事物可能会影响外层的大事物,导致事物丧失

传播属性主要分为以下几种:

  1. propagation.requre:如果外层没有事物,新增事物并加入,如果外部有事物,就加入外部事物,通常用于增删改
  2. propagation.supports:如果外部没有事物,则不开辟新的事物,如果外部有事物,则加入外部事物,通常用于查询操作
  3. propagation.requier_new:如果外部有事物,挂起外部事物,开启新的事物
  4. propagation.not_supported:不开启事物,如果外部有事物,则挂起外部事物
  5. propagation.never:不开启事物,如果开启则抛出异常

只读属性:针对于只进行查询的方法,提高查询效率,eg:readonly=true

超时属性:控制事物的等待时间,eg:timeout=2


spring中添加事物的方式

@Transactional,主要参数有以下几个

  1. isolation:代码隔离机制,具体使用方法:isolation=Isolation.具体的隔离机制
  2. propagation:事物的传播机制,具体使用方法:propagation=Propagation.具体的事物传播机制
  3. readonly:是否是只读,具体使用方法:readonly=true | false
  4. timeout:事物等待时间,具体使用方法:timeout=-1 | ? (单位:s)

猜你喜欢

转载自blog.csdn.net/qq_41454044/article/details/114069005