Spring事务管理
什么是事务?
事务是逻辑上的一组操作,要么都执行,要么都不执行
事务的特性:
1,原子性:
事务是最小的执行单位,不允许分割,事务的原子性确保动作要么全部完成,要么完全不起作用
2,一致性:
执行事务之前数据保持一致
3,隔离性:
并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
4,持久性:
一个事务被提交之后,它对数据库中的数据改变是持久的,即使数据库发生故障也不应该对其有任何影响
事务管理的方式:
1,编程时事务管理
是通过编写代码实现的事务管理,包括定义事务的开始,正常执行后的事务提交和异常时事务回滚
2,声明式事务管理
是通过AOP技术实现的事务管理,其主要思想是将事务管理作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”代码织入到
区别:
简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理,而声明式事务由于基于AOP
所以既能起到事务管理的作用,又可以不影响业务代码的具体实现
实例代码:
编写dao层
public class AccountDaoImpl implements AccountDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,readOnly=false)
@Override
public void transfer(String outUser, String inUser, Double money) {
// TODO Auto-generated method stub
// 收款时,收款用户的余额 =现有资金+所汇金额
this.jdbcTemplate.update(
"update account set balance = balance+? where username=?",
money, inUser);
// 0不能做分母 所以这里一定出现bug
// int i = 1/0;
// 汇款时,汇款用户的余额 =现有资金-所汇金额
this.jdbcTemplate.update(
"update account set balance = balance-? where username=?",
money, outUser);
}
实体类
配置文件
<!-- 1、配置数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!-- 链接数据库的url -->
<property name="url" value="jdbc:mysql://localhost:3306/demo" />
<!-- 链接数据库的用户名 -->
<property name="username" value="root" />
<!-- 链接数据库的密码 -->
<property name="password" value="123456" />
</bean>
<!-- 2、配置JDBC模板 里面封装好了crud(增删改查)代码 使用前提是得先链接数据库 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 3、定义id为accountDao的bean -->
<bean id="accountDao" class="com.bdqn.cn.dao.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 4、事务管理器,依赖于数据源 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 5、注册事务管理器驱动 -->
<tx:annotation-driven transaction-manager="transactionManager" />
测试类