这是我参与 8 月更文挑战的第 12天,活动详情查看: 8月更文挑战
我们都知道事务的四个特性 :原子性、一致性、持久性、隔离性,把保证一个或多个数据库的操作称为**事务(Transaction),**它是一个最小的不可分割的工作单元,最常见的举例银行转账两个账户的操作只能同时失败或者同时成功,数据库的默认引擎INNODB是支持事务的
- 原子性:事务的最小单位
- 一致性:操作必须同时成功或者同事失败
- 持久性:可持久化操作,就是操作保存到硬盘
- 隔离性:不同的事务之间互不影响
这里是事务的一个提交流程,一共有这么几个状态,在数据库操作时我们可以通过
-
BEGIN
-
START TRANSACTION
这两个随便一个开启事务,写完执行sql后commit进行事务的提交,如果不想执行了,想要回退,执行**rollback,**比如银行转账的
BEGIN
UPDATE 1表
UPDATE 2表
commit/rollback
对于回滚,我们可以自己调用,或者遇到某些异常系统自动调用回滚,在我们日常开发中,Spring可能已经为我们进行处理了或者Spring会简化我们对事务的场景定义;如果我们没有使用支持事务的引擎,那么是不支持回滚的
我们看下spring的事务传播机制:
- PROPAGATION_REQUIRED
Spring默认的传播机制,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务并执行 - PROPAGATION_REQUIRED_NEW
该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可,外层任务失败回滚,不能回滚内层事务的执行,内层失败报错,外层会捕获可不做回滚处理; - PROPAGATION_SUPPORTS
如果外层有事务,则加入外层事务,如果外层没有事务,则直接非事务方式执行。完全依赖外层的事务 - PROPAGATION_NOT_SUPPORTED
该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码 - PROPAGATION_NEVER
该传播机制不支持外层事务,即如果外层有事务就抛出异常 - PROPAGATION_MANDATORY
与NEVER相反,如果外层没有事务,则抛出异常 - PROPAGATION_NESTED
该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,内部事务不会对外部事务造成影响它只对DataSourceTransactionManager事务管理器起效
具体的场景使用不同传播方式,我们得根据业务场景而定