Java事务管理学习之Spring和Hibernate详解
什么是事务
事务是一组要么全部执行,要么全部不执行的操作。事务具有ACID(原子性、一致性、隔离性、持久性)特性。
在数据库中,事务可以保证数据的完整性和一致性。
Spring事务管理
Spring框架提供了对事务管理的支持。Spring事务管理是通过AOP实现的,在方法被调用时将事务逻辑织入到方法的前后。
Spring事务管理的步骤
- 配置数据源
- 配置事务管理器
- 开启注解事务支持
- 通过注解@Transactional声明事务,同时指定事务的属性
示例1:基于注解的事务管理
// UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Transactional
@Override
public void transferMoney(String fromAccount, String toAccount, double money) {
User fromUser = userDao.findByAccount(fromAccount);
User toUser = userDao.findByAccount(toAccount);
fromUser.setBalance(fromUser.getBalance() - money);
toUser.setBalance(toUser.getBalance() + money);
userDao.updateUser(fromUser);
userDao.updateUser(toUser);
}
}
示例中使用了@Transactional注解声明了事务,并指定了默认的事务属性。当方法抛出RuntimeException或者Error时,会导致事务回滚。
示例2:编程式事务管理
// UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Autowired
private PlatformTransactionManager transactionManager;
@Override
public void transferMoney(String fromAccount, String toAccount, double money) {
User fromUser = userDao.findByAccount(fromAccount);
User toUser = userDao.findByAccount(toAccount);
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
fromUser.setBalance(fromUser.getBalance() - money);
toUser.setBalance(toUser.getBalance() + money);
userDao.updateUser(fromUser);
userDao.updateUser(toUser);
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}
}
}
示例中通过获取事务管理器对象,并使用编程式事务管理的方式进行事务控制。由于需要手动捕获异常和回滚事务,因此代码相对比较冗长,但是可以更灵活地控制事务。同时,也可以按照需要对不同的方法使用不同的事务管理方式。
Hibernate事务管理
Hibernate是一个ORM框架,它也提供了对事务管理的支持。
Hibernate事务管理方式
- 编程式事务管理
- 声明式事务管理
示例3:基于Hibernate的声明式事务管理
// UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private SessionFactory sessionFactory;
@Transactional
@Override
public void transferMoney(String fromAccount, String toAccount, double money) {
Session session = sessionFactory.getCurrentSession();
User fromUser = session.get(User.class, fromAccount);
User toUser = session.get(User.class, toAccount);
fromUser.setBalance(fromUser.getBalance() - money);
toUser.setBalance(toUser.getBalance() + money);
session.update(fromUser);
session.update(toUser);
}
}
示例中通过@Autowired注解引入SessionFactory对象,然后使用@Transactional注解声明事务,并且通过sessionFactory.getCurrentSession()获取当前的Session对象,进行事务操作。
示例4:基于Hibernate的编程式事务管理
// UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private SessionFactory sessionFactory;
private TransactionTemplate transactionTemplate;
@PostConstruct
public void init() {
transactionTemplate = new TransactionTemplate(sessionFactory);
}
@Override
public void transferMoney(String fromAccount, String toAccount, double money) {
transactionTemplate.execute(status -> {
Session session = sessionFactory.getCurrentSession();
User fromUser = session.get(User.class, fromAccount);
User toUser = session.get(User.class, toAccount);
fromUser.setBalance(fromUser.getBalance() - money);
toUser.setBalance(toUser.getBalance() + money);
session.update(fromUser);
session.update(toUser);
return null;
});
}
}
示例中通过@Autowired注解引入SessionFactory对象,并且在@PostConstruct注解的方法中初始化了TransactionTemplate对象。然后使用execute方法手动开启事务,并传入Lambda表达式进行事务操作。
总结
本文主要介绍了Java事务管理学习之Spring和Hibernate详解,包括了Spring事务管理和Hibernate事务管理的相关知识点。同时,也给出了多个示例进行说明,希望能够对大家学习Java事务管理有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java事务管理学习之Spring和Hibernate详解 - Python技术站