|
区别
声明式事务:通过AOP(面向切面)方式在方法前使用编程式事务的方法开启事务,在方法后提交或回滚。用配置文件的方法或注解方法(如:@Transactional)控制事务。
编程式事务:手动开启、提交、回滚事务。
通俗地去理解两者的区别,即声明式事务只需要“声明”就可以达到事务的效果;编程式事务需要“编程”才可以达到事务效果。
声明式事务案例
业务层代码
@Override
@Transactional
public Map<String, Object> fun() {
}
编程式事务案例
工具类代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;
@Component
public class Utils {
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
// 开启事务
public TransactionStatus openTx() {
return dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
}
// 提交事务
public void commitTx(TransactionStatus ts) {
dataSourceTransactionManager.commit(ts);
}
// 回滚事务
public void rollbackTx(TransactionStatus ts) {
dataSourceTransactionManager.rollback(ts);
}
}
业务层代码
@Service
public class RegisterServiceImpl implements RegisterService {
@Autowired
private Utils utils;
@Override
public void programming(String name,String age,String studentId) {
TransactionStatus ts = null;
try {
// 开启事务
ts = utils.openTx();
registerMapper.programming( name, age, studentId);
int a=1/0;
registerMapper.programming( name, age, studentId);
if (ts != null) {
// 提交事务
utils.commitTx(ts);
}
} catch (Exception e) {
if (ts != null) {
// 回滚事务
utils.rollbackTx(ts);
}
}
}
}
|
|