一、事务的特性:
1.原子性
保证一个事务中数据要么全部成功提交,要么全部失败回滚,不能只执行其中一部分操作。
2.一致性
事务的执行不能破坏数据库的完整性和一直性,在事务的执行前后数据库都必须处于一致性状态。
3.隔离性
未授权读取(未提交的数据读取),授权读取(已提交数据的读取),可重复读取和串行化
4.持久性
一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态
注:mysql的MyISAM引擎不支持事务
二、查看数据库引擎
#查看数据库引擎
show engines;
三、配合spring框架使用方法以及配置:
1.spring配置事务
编程式
:通过编码的方式手动启用、提交或回滚事务,粒度更细,但更麻烦。
声明式
:通过在方法或类或接口上添加注解进行包装,无侵入地实现事务,更方便,但粒度更大。
2.配置事务管理器
<!-- 开启事务注解驱动,基于注解的声明式事务 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
四、简单测试使用编程式事务
1.数据库表中原数据:
2.对表进行添加和删除操作(使用100/0模拟引发错误)
@Override
public void shiwu(Liuyan record) {
// 开始事务
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
Liuyan liuyan = new Liuyan();
liuyan.setLyid(utils.getUUID());
liuyanMapper.insertSelective(liuyan);
liuyanMapper.deleteByPrimaryKey("7bebc14c-ba49-418f-b762-fb8a45e72502");
int ss=100/0;//模拟引发错误
transactionManager.commit(status);// 提交事务
} catch (Exception e) {
// TODO: handle exception
// 异常回滚,并不一定要在try...catch中
e.printStackTrace();
transactionManager.rollback(status);
}
}
3.执行后数据库未变:
4.删除(100/0错误)后执行事务数据库变化
已经不存在(7bebc14c-ba49-418f-b762-fb8a45e72502)这条数据并且随机增加了一条。