一、Spring的事务管理
-
事务的概念:
事务管理对于企业应用而言至关重要。它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至
于破坏后台数据的完整性。就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作过程中机器突然
出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过取款机一样,以
保证用户和银行的利益都不受损失。
简单来说:事务是一系列的动作,一旦其中有一个动作出现错误,必须全部回滚,系统将事务中对数据库的所有已完
成的操作全部撤消,滚回到事务开始的状态,避免出现由于数据不一致而导致的接下来一系列的错误。事务的出现是
为了确保数据的完整性和一致性,在目前企业级应用开发中,事务管理是必不可少的 -
事务的属性:
传播行为
隔离级别
只读提示
事务超时间隔
回滚原则
事务的属性:是对事务策略如何应用到方法上的描述。 -
传播行为
定义了事务应用到方法上的边界。也就是什么时候开始一个新的事务,或者什么时候事务被暂停,或者方法是
否要在事务中运行。
-
隔离级别
用来指定一个事务受其他并发事务活动影响的程度。隔离性是数据的事务的4个特征之一,但是实际上来说,用
户使用数据库产品是需要在效率和安全上找到平衡点的,所以需要设置事务的隔离级别;
-
只读提示
Read-only=true,必须配合传播行为来设置。一般建议设置在查询的方法中, -
事务超时间隔
可以让事务在特定的秒数后自动回滚,不必等到它自己结束。它也必须配合传播行为来设置。
Timeout=5 -
回滚规则
默认情况下在出现运行时异常RuntimeException才会回滚。检查时异常不回滚。当然也可以改变这种规则。
二、 声明式事务(常用)
声明式事务管理:它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。事务管理作为一种横切关注点,可以通过AOP方法模块化。Spring通过Spring AOP框架支持声明式事务管理。
声明式事务管理有三种方法实现,分别是TransactionProxyFactoryBean的代理方式、基于AspectJ的xml配置方
式和基于注解的声明方式,后两种在开发应用中常常出现。
声明式事务管理是基于AOP思想完成的,类似与在给业务层加入切面,对事务操作前后进行一定的事务管理控
制。
**
说明:前面的写的知识只要看一遍有一个映像就行,没有必要过于纠结。实战才是最好的老师。
**
1.基于注解版–转账案例
修改核心配置文件
<!--开启 类的注解 切点的注解-->
<context:component-scan base-package="com.kgc"></context:component-scan>
<!--开启切点的注解-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!--实例化 jdbc模板对象 需要数据源 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--创建一个自己的dataSource-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/k8514?
characterEncoding=utf-8"/>
<property name="user" value="root"/>
<property name="password" value="ROOT"/>
</bean>
<!--配置事务 管理 需要数据源 数据源有回滚 rollback(撤回)方法 -->
<bean id="transactionManager1"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启 事务的注解 -->
<tx:annotation-driven transaction-manager="transactionManager1"></tx:annotation-driven>
Dao实现类
@Repository
public class AccountDaoImpl implements AccountDao{
@Autowired
private JdbcTemplate template;
@Override
public void outAccount(String outCard, double money) {
String sql="update account set money=money-? where account=?";
template.update(sql, money,outCard);
}
@Override
public void inAccount(String inCard, double money) {
String sql="update account set money=money+? where account=?";
template.update(sql, money,inCard);
}
}
Service实现类
@Transactional//事务的注解,表示当前类下的所有方法均加入事务
@Service
public class AccountServiceImpl implements AccountService{
@Autowired
private AccountDao dao;
@Override
public void transferAccounts(String inCard, String outCard, double money) {
dao.outAccount(outCard,money);
//int i=1/0;
dao.inAccount(inCard,money);
}
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring/applicationContext.xml")
public class TestTx {
@Autowired
private AccountService service;
@Test
public void testTx1(){
service.transferAccounts("曹操","刘备",50);
System.out.println(1);
}
}