手写spring编程事务

package com.learn.service.impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionStatus;import com.learn.dao.UserDao;
import com.learn.service.UserService;
import com.learn.transaction.TransactionUtils;/*** 这就是编程式事务* * @author Leon.Sun**/
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate TransactionUtils transactionUtils;@Autowiredprivate UserDao userDao;public void add() {/*** transactionStatus这样起名还是规范一点* */TransactionStatus transactionStatus = null;/*** 这里一定要try起来* 事务没问题才会提交* 有问题就会回滚* */try {/*** 开启事务*/transactionStatus = transactionUtils.begin();userDao.add("test001", 20);/*** 这个时候test001会不会提交到数据库里面去* 肯定不会的* 因为你的事务还没有提交* 我怎么可能到数据库里面查到呢* 是肯定不会到数据库里面去的* 因为你没有commit我怎么能到数据库里面查的到呢* 肯定是不会的* 我们打个断点看一下* 已经走完了* 有没有数据你们说* 是不是没有* 因为你没有提交到数据库里面去* 报错他就会走到catch里面去* 他就会把事务回滚* 数据库里面是不是没有* * 比如我们搞一个不报错的* 我再运行一遍* 只要你不提交肯定是查不到的* 到这里是不是查不到* 当transactionUtils.commit(transactionStatus)这段代码执行完毕的情况下* 你这两个数据都是可以查到的* 是不是提交了* 提交了之后test001和test002是不是都有了* 这就是事务的一个基本原理* 到时候我们结合AOP自己封装一个事务* * */System.out.println("开始报错了..........................");
//			int i = 1/0;System.out.println("####################################");userDao.add("test002", 21);/*** 提交事务* transactionStatus!=null这个是为了安全起见*/if(transactionStatus!=null) {				transactionUtils.commit(transactionStatus);}} catch (Exception e) {e.printStackTrace();/*** 异常我们最好这样子做* 如果发生异常的情况下* 走到这里一定要调用rollback* 回滚事务* transactionStatus!=null这个是为了安全起见*/if(transactionStatus!=null) {				transactionUtils.rollback(transactionStatus);}}}
}
package com.learn.transaction;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;/*** 我们今天讲手写事务* 我们要他的注解来实现事务* 注解其实都是封装起来的* 通过编程事务进行封装的* 编程事务(需要手动begin 手动回滚  手都提交)* 在这里我们要封装几个方法* 你们只要拿到ORM框架的接口就行了* 我们的数据源接口是哪一个* 就是dataSourceTransactionManager这个* 我们要拿到事务数据源* 然后进行控制事务* * 我们要把注入到Spring的容器里面去* 你们最好不要用单例的* 否则会产生线程安全问题的* * * * @author Leon.Sun**/
@Component
public class TransactionUtils {/*** 获取事务源* * 这里要注入一下@Autowired* */@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;/*** 这个方法干嘛用的* 是不是开启事务* * * @return*/public TransactionStatus begin() {/*** 我们调用一下dataSourceTransactionManager* 我们先使用默认的传播级别DefaultTransactionAttribute* 没有学到传播级别* 不知道他里面怎么去用* 拿到了事务的一个状态* 记得要把事务的状态返回回去* 这里是开启一个事务* 我要提交事务怎么提交呢*/TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());return transaction;}/*** 这叫做提交事务* * 把状态传入进来* * * @param transaction*/public void commit(TransactionStatus transaction) {/*** 提价一个事务状态* */dataSourceTransactionManager.commit(transaction);}/*** 我们再写一个回滚事务* @param transaction*/public void rollback(TransactionStatus transaction) {dataSourceTransactionManager.rollback(transaction);}
}
package com.learn.test;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.service.UserService;public class Test001 {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");UserService userService = (UserService) applicationContext.getBean("userServiceImpl");userService.add();}}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部