java吧 关注:1,249,423贴子:12,731,503
  • 10回复贴,共1

手写的事务控制器 为什么控制不了事务?

只看楼主收藏回复

package com.atguigu.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.sql.Connection;
import java.util.Arrays;
@Component
@Aspect
public class DataSourceTransactionManagerTest {
@Autowired
private DataSource dataSource;
//将 service层的 public void checkOut(String username, String isbn,int number){} 作为目标方法
@Around(value = "execution(public void com.atguigu.service.BookService02.checkOut(..))")
public Object arrountMeshod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object proceed = null;
Object[] args = proceedingJoinPoint.getArgs(); //获取目标方法的参数
Signature signature = proceedingJoinPoint.getSignature(); //获取目标方法的签名
String methodName = signature.getName(); //获取目标方法的名称
//前置通知
//获取连接
System.out.println("[前置通知],获取连接,设置事务非自动提交,执行方法:(" + methodName + ") + " + ",方法参数为:" + Arrays.asList(args));
Connection connection = dataSource.getConnection();
//设置 非自动提交事务
connection.setAutoCommit(false);
try {
//目标方法执行
proceed = proceedingJoinPoint.proceed();//相当于动态代理的 method.invoke(obj,args)
//返回通知
//提交事务
System.out.println("[返回通知],提交事务,执行方法:(" + methodName + ") + " + ",执行结果是:" + proceed);
connection.commit();
}catch (Exception e){
//异常通知
//回滚事务
System.out.println("[异常通知],回滚事务,异常信息:" + e);
connection.rollback();
}finally {
//后置通知
//释放连接
System.out.println("[后置通知],提交事务,执行方法:(" + methodName + ") + ");
connection.close();
}
return proceed;
}
}


IP属地:陕西1楼2021-12-19 14:21回复
    [前置通知],获取连接,设置事务非自动提交,执行方法:(checkOut) + ,方法参数为:[Tom, ISBN-005, 1]
    ISBN-005价格为500
    总共减去用户:Tom余额500
    减去书名为:ISBN-005的库存1
    [异常通知],回滚事务,异常信息:org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [UPDATE11 book_stock SET store = store - ? WHERE isbn = ?]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE11 book_stock SET store = store - 1 WHERE isbn = 'ISBN-005'' at line 1
    [后置通知],提交事务,执行方法:(checkOut) +
    为什么没回滚呢?


    IP属地:陕西2楼2021-12-19 14:24
    回复
      public void updateBookStore(String isbn, int number){
      //sql UPDATE book_store SET store = store - ? WHERE isbn = ?
      String sql = "UPDATE11 book_stock SET store = store - ? WHERE isbn = ?";
      //Spring的 JdbcTemplate 更新操作 的参数 只用写一个 sql,接着按照sql语句的问号 依次写出 本方法传递的参数就行了
      System.out.println("减去书名为:" +isbn + "的库存" + number);
      jdbcTemplate.update(sql, number, isbn);
      }
      }
      String sql = "UPDATE11 book 这里故意写错 但是没有回滚事务


      IP属地:陕西3楼2021-12-19 14:25
      回复
        service层的 public void checkOut(String username, String isbn,int number){} 作为目标方法
        是不是 事务管理器 切面类 的 连接对象 和 service的连接对象 不一致?


        IP属地:陕西4楼2021-12-19 14:27
        回复
          没人吗


          IP属地:陕西5楼2021-12-19 14:42
          回复
            11111111111111


            IP属地:陕西6楼2021-12-19 14:48
            回复
              意识很到位,那想过没有,spring事务是怎么处理这个问题的,然后再模仿他自己玩玩


              IP属地:湖南7楼2021-12-19 15:17
              回复
                111111111111


                IP属地:陕西8楼2021-12-19 15:19
                回复
                  没仔细看,你是怎么设计的啊?捕获异常设置回滚就好了呀


                  IP属地:贵州来自Android客户端9楼2021-12-19 17:38
                  回复
                    不是同一个链接


                    IP属地:马来西亚来自Android客户端10楼2021-12-19 22:54
                    回复
                      怎么弄成同一个链接呢?


                      IP属地:陕西11楼2021-12-20 16:24
                      回复