基础概念
事务的相关解读:用于一组要么一起成功要么一起失败的场景
什么是事务 | 将一组操作绑定在一起,要么都成功或者都失败的操作 |
生活中需要事务的案例 | 转账 |
事务的目的 | 保证操作的原子性 |
操作失败的标准 | 操作过程出现了异常,导致操作没有执行完成 |
事务控制的重点 | 在失败的情况下,如何撤销已经成功的操作 |
事务成功的标准 | 数据发生了变化 |
事务控制的原理 | 封装数据库的事务来实现 |
应用事务与数据库事务的关系
应用事务,即我们通常所讲的spring事务。Spring事务通过对数据库事务的封装:在事务开始时,取消数据库事务的自动提交机制;在操作数据时,只进行了数据的提交;只有在一组操作全部完成的情况下,封装数据库事务的conn.commit()才提交事务;在一个操作出现异常时,封装数据库事务的conn.rollback(),来实现事务回滚的目的。
在单一数据源的情况下,如何使事务中的多个操作共同使用同一个连接?
在单一数据源的情况下,通常对外提供多个数据库连接对象,供外部使用,以实现频繁创建销毁数据库连接造成的性能低下问题。但在spring中,可能会造成一组操作中的不同的操作,使用的是不同的数据库连接;从而造成事务的conn.rollback()失效。
但是对于同一事务下的多个操作,必定属于同一个线程。故可以将获取的数据库连接对象存放在当前的线程ThreadLocal中,在下次操作时,直接从ThreadLocal中获取该数据库连接对象,进而避免单一数据源下事务中的多个操作使用不同的连接造成conn.rollback()失效的问题。
在多数据源的情况下,如何使用数据库事务?
在多数据源情况下,一组操作中的操作可能属于不同的数据源下的不同的连接对象。将不同数据源的事务分别放在对应的局部事务中,在全局事务(应用事务)成功时,提交多个局部事务;在全局事务失败时,回滚多个局部事务。