当前位置:   article > 正文

SqlSession对象在事务中的使用_sqlsession开启事务

sqlsession开启事务

使用mybatis获取到SqlSession会话对象执行多条sql语句

  1. @Override
  2. public int transfer(String fromActon, String toActon, Double money) throws IOException {
  3. SqlSession sqlSession = AgentUtil.getSqlSession();
  4. AccountDao mapper = sqlSession.getMapper(AccountDao.class);
  5. Account account1 = mapper.selectByActon(fromActon);
  6. Account account2 = mapper.selectByActon(toActon);
  7. if (account1.getBalance()>money){
  8. account1.setBalance(account1.getBalance()-money);
  9. account2.setBalance(account2.getBalance()+money);
  10. mapper.updateByActon(account1);
  11. System.out.println(1/0);
  12. mapper.updateByActon(account2);
  13. sqlSession.commit();
  14. AgentUtil.close(sqlSession);
  15. }
  16. return 1;
  17. }

 工具类获取会话对象

  1. public class AgentUtil {
  2. private static SqlSessionFactory factory;
  3. private AgentUtil(){}
  4. static {
  5. try {
  6. factory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. private static ThreadLocal<SqlSession> local=new ThreadLocal<>();
  12. public static SqlSession getSqlSession(){
  13. SqlSession sqlSession=local.get();
  14. if (sqlSession==null){
  15. sqlSession= factory.openSession();
  16. local.set(sqlSession);
  17. }
  18. return sqlSession;
  19. }
  20. public static void close(SqlSession sqlSession){
  21. if (sqlSession != null) {
  22. sqlSession.close();
  23. local.remove();
  24. }
  25. }
  26. }

解析一下这段代码:使用mybatis框架获取一个和数据库交互的SqlSession对象,在第一次创建的时候将这个对象存放到这个线程的域中,然后再业务代码中开启一个事务管理(也就是获取通过工具类获取 SqlSession sqlSession = AgentUtil.getSqlSession();) 最后执行完所有的sql操作之后一起提交到数据库。如果中途出现了异常,事务会将数据库中的操作直接回滚,避免数据出错。

在这里事务管理一共有两个作用:

1.首先会对数据库数据保护,防止异常导致数据出错

2.会将所有的数据库操作使用同一个sqlsession对象来操作

如果不启用事务管理

如果不将 sqlSession对象绑定到当前的线程域中,那么事务管理不会起作用。

一个sqlSession对象一次只能对数据库进行一次操作。那么如果不开启,第一条语句占用了当前事务(这里查询可以),第二条语句就因为获取不到这个事务导致超时异常,有一个锁在里面。

这个时候想执行你的多个语句操作,有两种解决方式:

1.将这个对象绑定到这个线程域,开启事务管理,最后一起提交

2.第二个操作就是在使用openSession(true),这样就可以关闭事务。然后使用两个SqlSession对象来操作数据库,不然会出现占用无法执行的问题

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/158261
推荐阅读
相关标签
  

闽ICP备14008679号