一,事务
1,事务的四大特性ACID:
原子性(Atomicity)
事务是最小的执行单位,不可再分割
一致性(Consistency)
事务前后的数据都是正确的
隔离性(Isolation)
事物之间相互隔离,互不干扰(并发执行的事务彼此无法看到对方的中间状态)
持久性(Durability)
事务一旦提交不可再回滚
2,事务隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| Read Uncommitted | 可能 | 可能 | 可能 |
| Read Committed | 不可能 | 可能 | 可能 |
| Repeatable Read | 不可能 | 不可能 | 可能 |
| Serializable | 不可能 | 不可能 | 不可能 |
二,mysql,jdbc,mybast事务
mysql使用事务
开启事务:start transication
数据提:commin
数据回滚:rollback
在jdbc当中使用使用
Connection conn = dataSource.getConnection();
conn.setAutoCommit(false); // 关闭自动提交(开启事务)
通过conn调用commit 方法和 rollback方法进行事务的提交删除
java
Connection conn = dataSource.getConnection();
try {
conn.setAutoCommit(false); // 关闭自动提交
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO table1 VALUES (...)");
stmt.executeUpdate("UPDATE table2 SET ...");
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
} finally {
conn.setAutoCommit(true); // 恢复默认设置
conn.close();
}
mybatis事务管理
通过创建工厂得到sqlSession
java
SqlSession sqlSession = sqlSessionFactory.openSession(false);
try {
// 业务逻辑代码
sqlSession.commit();
} catch (Exception e) {
sqlSession.rollback();
throw e; // 建议重新抛出异常以便上层处理
} finally {
sqlSession.close(); // 确保资源释放
}
三,Spring中事务控制的API介绍
Spring为不同的orm框架提供了不同的PlatformTransactionManager接口实现类:
-
DataSourceTransactionManager:使用Spring JDBC或iBatis 进行持久化数据时使用
-
HibernateTransactionManager:使用Hibernate版本进行持久化数据时使用

1、PlatformTransactionManager
作用:是一个事务管理器,负责开启、提交和回滚事务
实现类:DataSourceTransactionManager


2、TransactionDefinition
作用:定义事务的属性
实现类:DefaultTransactionDefinition
接口里面的方法都有默认值
TransactionDefinition事务定义
1)隔离级别
default:默认值,使用数据库数据库默认的隔离级别
read_uncommitted x x x
read_committed 脏读 x x
repeatable_read 脏读 不可重复度 x
serializable 脏读 不可重复度 幻读
2)传播行为
required:默认值,methodB()会加入methodA()的事务中
supports:支持当前事务,没有事务则以非事务方式运行,适合查询
3)事务超时
default:默认值,永不超时
4)是否只读
false:默认值,记录log(效率低),适合增删改
true:不记录log(效率高),适合查询
5)回滚规则
默认值RuntimeException,即所有运行时异常都回滚
如何使用Spring事务的方法
(1)Spring 事务的 XML 配置
java
<!-- 事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource1" ref="dataSource"></property>
//ref="dataSource" 数据源的name
</bean>
<bean class="org.springframework.transaction.support.DefaultTransactionDefinition">
<!--
隔离级别:默认值是default,使用mysql默认的隔离级别repeatable_read
传播行为:默认值required,methodB()会加入到methodA()的事务中
事务超时:默认值是-1,永不超时
是否只读:默认值是false,记录log适合增删改
回滚规则:默认值RuntimeException,即所有运行时异常都回滚
-->
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>
<property name="isolationLevelName" value="ISOLATION_DEFAULT"></property>
</bean>
<!-- 启用注解驱动的事务管理 -->
<context:annotation-config/>
(2)事务的启动
依赖注入
PlatformTransactionManager
TransactionDefinition
PlatformTransactionManager
是 Spring 事务抽象的核心接口,定义了事务管理的核心操作契约,是事务的执行主体。其核心职责是根据事务定义规则,完成事务的开启、提交、回滚 等底层操作,具体实现由对应数据源 / 持久化框架的事务管理器
TransactionDefinition:
是事务属性的标准化定义接口,用于描述事务的行为规则,是事务管理器执行操作的依据
TransactionStatus:记录当前事务的运行状态( 是当前事务执行状态的快照对象)
java
//事务管理
@Autowired
private
PlatformTransactionManager txManager;
// 事务定义
@Autowired
private TransactionDefinition txDefinition;
@Override
public void transfer(String name1, String name2, float money) {
// 开启事务
TransactionStatus txStatus = txManager.getTransaction(txDefinition);
try {
userMapper.transferAdd( name1, money);
userMapper.transferSuf(name2, money);
// 提交事务
txManager.commit(txStatus);
}catch (Exception e){
// 回滚事务
txManager.rollback(txStatus);
e.printStackTrace();
}
}