原创

MYSQL事务

温馨提示:
本文最后更新于 2023年04月07日,已超过 240 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我
事务的4个特性(ACID):
1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。
2) 一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。(实例:转账,两个账户余额相加,值不变。)
3) 隔离性(isolation):一个事务的执行不能被其他事务所影响。
4) 持久性(durability):一个事务一旦提交,事物的操作便永久性的保存在DB中。即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

Java有几种类型的事务?
Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。

navicat手动进行事务的提交与回滚:
已提交的事务无法回滚,要在提交之前回滚才可以。
事务并发问题:
脏读
不可重复读
幻读

四个隔离级别:
七个传播行为:


@Transactional 是声明式事务管理 编程中使用的注解
1 .添加位置
1)接口实现类或接口实现方法上,而不是接口类中。
2)访问权限:public 的方法才起作用。@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。
系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管理,由于配置了@Transactional就需要AOP拦截及事务的处理,可能影响系统性能。
3)错误使用:
  1. 接口中AB两个方法,A@Transactional标签,B有,上层通过A间接调用B,此时事务不生效。
  2. 接口中异常(运行时异常)被捕获而没有被抛出。
  3. 默认配置下,spring 只有在抛出的异常为运行时 unchecked 异常时才回滚该事务,
  4. 也就是抛出的异常为RuntimeException 的子类(Errors也会导致事务回滚),
  5. 而抛出 checked 异常则不会导致事务回滚 。可通过 @Transactional rollbackFor进行配置。
  6. 多线程下事务管理因为线程不属于 spring 托管,故线程不能够默认使用 spring 的事务,
  7. 也不能获取spring 注入的 bean 。
  8. 在被 spring 声明式事务管理的方法内开启多线程,多线程内的方法不被事务控制。
  9. 一个使用了@Transactional 的方法,如果方法内包含多线程的使用,方法内部出现异常,
  10. 不会回滚线程中调用方法的事务。
  11. 如果测试某个类或者方法时不需要回滚,只需要单独的显示设置@Rollback(false)就可以了。


分布式事务:
随着互联网的快速发展,软件系统由原来的单体应用转变为分布式应用,下图描述了单体应用向微服务的演变:分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操 作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如用户注册送积分 事务、创建订单减库存事务,银行转账事务等都是分布式事务。

典型的场景就是微服务架构 微服务之间通过远程调用完成事务操作。 比如:订单微服务和库存微服务,下单的 同时订单微服务请求库存微服务减库存。 简言之:跨JVM进程产生分布式事务。
随着互联网的快速发展,软件系统由原来的单体应用转变为分布式应用,下图描述了单体应用向微服务的演变:分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操 作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如用户注册送积分 事务、创建订单减库存事务,银行转账事务等都是分布式事务。
正文到此结束
本文目录