一、事务
1、什么是事务
将一系列操作当作一个完整工作单元,要么成功,要么失败,就是事务
2、事务的特性(ACID)
1)、原子性
不可分割的最小单位,是一个整体
2)、持久性
事务一创建对数据的改变是永久性的
3)、一致性
数据能够保持一致
4)、隔离性
一个事务与另一个事务并不能相互调用,互相干扰
(1)、没有隔离性的问题
1、读数据来说
1)、脏读:一个事务读取到另一个事务未提交的数据
2)、幻读/虚读:一个事务读取到另一个事务insert 的数据,导致事务多次读取的数据不一致
3)、不可重复读: -一个事务读取到另一个事务update的数据,导致事务多次读取的数据不一致
2、写数据来说
数据不能够正常更新
(2)、隔离级别
1、read uncommited读未提交,不能解决任何问题
2、Replatedread重复读, 解决了脏读的问题,但是幻读和不可重复读有可能发生
3、read commited 读已提交, 解决了不可重读的问题,但是脏读、幻读有可能发生
4、Serilizable序列化, 能够解决所有读的问题
(3)、spring事务传播行为
二、转账案例
1、dao层
public interface BankDao {
//转出
void out(String outname,int money);
//转入
void in(String inname,int money);
}
2、impl层
//转出
public void out(String outname, int money) {
String sql = "update bank set money = money - ? where name = ?";
Object[] obj = {money,outname};
jdbcTemplate.update(sql,obj);
}
public void in(String inname, int money) {
String sql = "update bank set money = money + ? where name = ?";
Object[] obj = {money,inname};
jdbcTemplate.update(sql,obj);
}
3、service层
//转账
void Transfer(String outname,String inname,int money);
4、serviceImpl层
@Service("bankService")
@Transactional
public class BankServiceImpl implements BankService {
@Resource(name = "bankDao")
private BankDao bankDao;
//
public void Transfer(String outname, String inname, int money) {
bankDao.out(outname,money);
int i = 1/0;
bankDao.in(inname,money);
}
}
5.1、XML配置事务
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- aop配置-->
<aop:config>
<aop:pointcut id="pointcut1" expression="execution(* com.hp.service.impl.BankServiceImpl.* (..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"></aop:advisor>
</aop:config>
5.2、事务注解开发
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 注解开发事务-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>