创手机网站,建立wordpress,做视频网站许可证,快云助手网站建设视频教程对于数据库事务#xff0c;我们都不陌生#xff0c;数据库的事务#xff08;Transaction#xff09;是数据库管理系统执行过程中的一个逻辑单位#xff0c;也是一个不可分割的工作单位。它包含一个或多个SQL语句#xff0c;这些语句要么全部执行#xff0c;要么全部不执…对于数据库事务我们都不陌生数据库的事务Transaction是数据库管理系统执行过程中的一个逻辑单位也是一个不可分割的工作单位。它包含一个或多个SQL语句这些语句要么全部执行要么全部不执行。事务是一个原子操作单元其对数据的修改要么全都执行要么全都不执行。那么我们就得来看看这个 Mybatis 是怎么处理事务的了。
ACID特性
原子性Atomicity事务是一个原子操作单元其对数据的修改要么全都执行要么全都不执行。
一致性Consistency事务必须使数据库从一个一致性状态变换到另一个一致性状态。
隔离性Isolation事务的执行不受其他事务的干扰事务执行的中间结果对其他事务是不可见的。
持久性Durability一旦事务提交则其结果就是永久性的即使系统发生崩溃事务执行的结果也不能丢失。
我们通过使用事务可以确保数据的完整性和一致性特别是在多个用户或系统并发访问和修改数据库时。如果没有事务那么在这些并发操作中可能会出现数据不一致、数据丢失或数据重复等问题。通过使用事务可以锁定被修改的数据直到事务完成并提交从而确保数据的完整性和一致性。
Mybatis的事务
MyBatis 的事务控制可以从以下几个方面入手
1.事务管理机制的选择MyBatis 提供了两种主要的事务管理机制分别是 JDBC 事务管理机制和 MANAGED 事务管理机制。
JDBC 事务管理机制这种机制利用 java.sql.Connection 对象来完成对事务的提交commit()、回滚rollback()、关闭close()等操作。MyBatis 框架自身会管理事务采用原生的 JDBC 代码去管理事务如设置 conn.setAutoCommit(false); 来开启事务并在业务处理完成后手动提交事务 conn.commit();。MANAGED 事务管理机制在这种机制下MyBatis 本身不会去实现事务管理而是让程序的容器如 JBOSS、Weblogic来实现对事务的管理。
2.事务的配置在 MyBatis 的 XML 配置文件中可以通过节点定义连接某个数据库的信息而的 type 属性决定了使用哪种类型的事务管理机制。例如将的 type 配置为 JDBC 会使用 JDBC 事务管理机制。
3.事务工厂的创建MyBatis 的事务管理依赖于 TransactionFactory 事务工厂的创建。根据的 type 配置和 DataSource 实例TransactionFactory 会创建一个 Environment 对象该对象表示一个数据库的连接并且会被设置到 Configuration 实例中以供后续使用。
4.业务场景的应用在实际的业务场景中如购买操作包含多个执行过程查询库存、下单、更新库存或两个患者账户之间的转账操作需要确保这些操作作为一个整体进行要么全部成功要么全部失败并回滚。这时就需要引入事务控制保证整个操作的有效性。
5.事务的边界管理合理控制事务的边界也是非常重要的。过宽的事务边界可能导致事务执行时间过长影响系统性能而过窄的事务边界则可能导致数据不一致。因此在设计系统时需要仔细考虑每个事务的边界。
6.异常处理在事务执行过程中如果出现异常需要根据异常类型和业务需求决定是回滚事务还是进行其他处理。确保在出现异常时能够正确地处理事务避免数据的不一致和丢失。
如何设置Mybatis的全局事务
在 MyBatis 中全局事务的设置通常依赖于底层的数据库连接池和事务管理器。MyBatis 本身并不直接提供全局事务管理的功能而是依赖于 JDBC、Spring 或其他容器提供的事务管理机制。下面是一些常见的方法来设置 MyBatis 的全局事务
1. 使用 JDBC 进行事务管理
如果你的应用没有使用 Spring 或其他容器你可以直接使用 JDBC 进行事务管理。在 MyBatis 的配置文件中你可以将事务管理器设置为 JDBC。
configuration environments defaultdevelopment environment iddevelopment transactionManager typeJDBC/ dataSource typePOOLED !-- 数据库连接配置 -- /dataSource /environment /environments !-- 其他配置 --
/configuration
在代码中你需要手动管理事务的开启、提交和回滚。
try (SqlSession session sqlSessionFactory.openSession()) { // 开启事务 Connection conn session.getConnection(); conn.setAutoCommit(false); // 执行业务逻辑... // 提交事务 conn.commit();
} catch (Exception e) { // 回滚事务 try (Connection conn session.getConnection()) { if (!conn.isClosed()) { conn.rollback(); } } catch (SQLException ex) { // 处理异常 } // 处理异常...
}
2. 使用 Spring 管理 MyBatis 事务
如果你的应用使用了 Spring 框架那么可以利用 Spring 的声明式事务管理来管理 MyBatis 的事务。这通常是通过在 Spring 配置文件中配置事务管理器并在需要事务的方法上使用 Transactional 注解来实现的。
beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:txhttp://www.springframework.org/schema/tx xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd !-- 配置数据源 -- bean iddataSource classorg.apache.commons.dbcp.BasicDataSource destroy-methodclose !-- 数据源属性配置 -- /bean !-- 配置 SqlSessionFactory -- bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ !-- 其他配置 -- /bean !-- 配置事务管理器 -- bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean !-- 开启注解事务管理 -- tx:annotation-driven transaction-managertransactionManager/ !-- 其他配置 --
/beans
Java 代码中使用 Transactional
Service
public class MyService { Autowired private MyMapper myMapper; Transactional public void myTransactionalMethod() { // 执行业务逻辑... myMapper.updateSomeData(); // 如果抛出异常则事务回滚 }
}
在上面的例子中Transactional 注解告诉 Spring 在执行 myTransactionalMethod 方法时应该开启一个事务。如果方法执行成功则事务提交如果方法抛出异常则事务回滚。
3. 使用其他容器的事务管理
除了 Spring还有其他一些容器或框架也提供了事务管理的功能如 Java EE 容器。如果你正在使用这些容器或框架你可以根据它们的文档来配置和管理 MyBatis 的事务。
确保你的数据库连接池支持事务。大多数现代连接池如 HikariCP、c3p0、DBCP 等都支持事务。在使用 Spring 或其他容器管理事务时确保你的 MyBatis Mapper 接口或实现类被正确地扫描和注册为 Spring Bean。在使用 Transactional 注解时注意其传播行为propagation behavior、隔离级别isolation level等属性的设置以满足你的业务需求。
所以你对Mybatis的事务了解了么