说说mysql的事务

255 阅读3分钟

这是我参与 8 月更文挑战的第 12天,活动详情查看: 8月更文挑战

我们都知道事务的四个特性 :原子性、一致性、持久性、隔离性,把保证一个或多个数据库的操作称为**事务(Transaction),**它是一个最小的不可分割的工作单元,最常见的举例银行转账两个账户的操作只能同时失败或者同时成功,数据库的默认引擎INNODB是支持事务的 

  1. 原子性:事务的最小单位
  2. 一致性:操作必须同时成功或者同事失败
  3. 持久性:可持久化操作,就是操作保存到硬盘
  4. 隔离性:不同的事务之间互不影响

这里是事务的一个提交流程,一共有这么几个状态,在数据库操作时我们可以通过

  1. BEGIN

  2. START TRANSACTION

这两个随便一个开启事务,写完执行sql后commit进行事务的提交,如果不想执行了,想要回退,执行**rollback,**比如银行转账的

BEGIN
UPDATE 1UPDATE 2commit/rollback

对于回滚,我们可以自己调用,或者遇到某些异常系统自动调用回滚,在我们日常开发中,Spring可能已经为我们进行处理了或者Spring会简化我们对事务的场景定义;如果我们没有使用支持事务的引擎,那么是不支持回滚的

我们看下spring的事务传播机制:

  • PROPAGATION_REQUIRED
    Spring默认的传播机制,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务并执行
  • PROPAGATION_REQUIRED_NEW
    该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可,外层任务失败回滚,不能回滚内层事务的执行,内层失败报错,外层会捕获可不做回滚处理;
  • PROPAGATION_SUPPORTS
    如果外层有事务,则加入外层事务,如果外层没有事务,则直接非事务方式执行。完全依赖外层的事务
  • PROPAGATION_NOT_SUPPORTED
    该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码
  • PROPAGATION_NEVER
    该传播机制不支持外层事务,即如果外层有事务就抛出异常
  • PROPAGATION_MANDATORY
    与NEVER相反,如果外层没有事务,则抛出异常
  • PROPAGATION_NESTED
    该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,内部事务不会对外部事务造成影响它只对DataSourceTransactionManager事务管理器起效

具体的场景使用不同传播方式,我们得根据业务场景而定