浅谈事务的四大特性及多线程事务问题

浅谈事务的四大特性及多线程事务问题

viEcho Lv5

概念

事务是指一段程序应用中,所有的操作都在一个执行单元内,一旦一个操作失败,那么其他的操作都会回滚,简单来说要么全部执行成功,要么全部执行失败;

事务的四大特性(简称ACID)

  • 原子性:原子性是指事务包含的操作是一个极小的操作单元,是不可拆分的;其中的操作要么全部完成,要么全部不完成;在事务执行的过程中,如果出现运行时异常事务会回滚,那么事务会回滚到之前没有执行的状态;

  • 一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

  • 隔离性:隔离性是对于多线程并发来说的,比如线程A和线程B,他们之间的事务的执行是隔离的,不会互相干扰,对于彼此来说是不可见得;对于事务的隔离机制,主要是数据提供的几种隔离级别;例如mysql提供了4种隔离级别:① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。② Repeatable read (可重复读):可避免脏读、不可重复读的发生。③ Read committed (读已提交):可避免脏读的发生。④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。其中mysql默认的是第二种可重复读;

  • 持久性:持久性是指一个事务一旦提交后,那么数据库的状态就是永久的,不可更改了;

spring中如何管理事务的?

这是面试中常问的了,我们都知道spring的IOC和AOP两大特点,其中AOP的典型应用就是事务的管理;spring容器通过AOP,在需要控制的事务的方法前加上开启事务的控制器,在其后加上事务的提交和回滚方法,这样就使事务在我们的方法中生效了;当然AOP的事务控制肯定不是我说的这么简单,但是原理大致是这样;具体可以看PlatformTransactionManager事务管理器中的源码了解,这里不再发散哈;

其实我们Spring中在方法上加上@Transactional注解,就是声明式的事务控制方式,但是使用此注解,需要注意Spring中事务控制中只捕获了运行时异常,对于非运行时的异常,没有捕获,通常我们需要指定rollbackFor=Exception.class,对于有可能执行很长时间的事务,我们还需要声明超时时间timeOut=60*3;

多线程中事务是互相隔离的吗?

我们写个例子测试一下,首先我们建一张表User表,其次我们多线程插入一些数据看下,当循环到某一次手动抛出一个异常看下;

1

  • Title: 浅谈事务的四大特性及多线程事务问题
  • Author: viEcho
  • Created at : 2021-04-23 19:55:09
  • Updated at : 2024-01-18 14:50:22
  • Link: https://viecho.github.io/2021/0423/4-characteristics-of-transaction.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments