事务
????事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元)。 ????通俗的讲,就是为了达到某个目的,而做的一系列的操作,要么一起成功(事务提交),要么一起失败(事务回滚)。
spring事务
作用
????在数据层或业务层保障一 系列的数据库操作同成功同失败。
使用
基本案例:在两个账户之间实现转账操作(bean的配置类已经设置完备)
Pojo层:
public class Account implements Serializable {
private Integer id;
private String name;
private Double money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
Dao层:
public interface AccountDao {
@Update("update tbl_account set money = money + #{money} where name = #{name}")
void inMoney(@Param("name") String name, @Param("money") Double money);
@Update("update tbl_account set money = money - #{money} where name = #{name}")
void outMoney(@Param("name") String name, @Param("money") Double money);
}
Service层:
public interface AccountService {
public void transfer(String out,String in ,Double money) ;
}
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
public void transfer(String out,String in ,Double money) {
accountDao.outMoney(out,money);
accountDao.inMoney(in,money);
}
}
Test类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {
@Autowired
private AccountService accountService;
@Test
public void testTransfer() throws IOException {
accountService.transfer("Tom","Jerry",100D);
}
}
原数据:  正常运行结果:  ? ? ? 在业务层添加异常:
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
public void transfer(String out,String in ,Double money) {
accountDao.outMoney(out,money);
int i = 1/0;
accountDao.inMoney(in,money);
}
}
异常运行结果:  原因:因为在转账过程中出现异常,第二个账户的金额操作之前程序被阻断。 没有做到同时成功或者同时出错,违背了程序的设计初衷。 ? ? ? ?
添加spring事务功能
Service层:
public interface AccountService {
@Transactional
public void transfer(String out,String in ,Double money) ;
}
JdbcConfig配置类:
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
再次运行原测试程序的结果:  原因:在程序出现异常时,事务对操作进行了回滚,保证了程序同时成功或同时失败。
? ? ? ?
事务角色
事务管理员
??发起事务方,在Spring中通常指代业务层开启事务的方法。
事务协调员
??加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法。 ? ? ? ?
事务相关配置

? ? ? ?
事务传播行为

|