mybatis-spring编程式事务处理BUG

时间:2021-11-04 05:11:03
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try {
  userMapper.insertUser(user);
  userMapper.insertUser(user);
}
catch (MyException ex) {
  txManager.rollback(status);
  throw ex;
}
txManager.commit(status);
——————————————————————————————————————————————
userMapper.insertUser(user);有2句,应该是往这个表里插入2条一样的数据,但是为什么只插入了1条啊,不是表主键的问题,表允许插入2条完全一样的数据

9 个解决方案

#1


自己顶

#2


请设置log4j级别为debug
看看执行
  userMapper.insertUser(user);
  userMapper.insertUser(user);
时的sql语句
就我的理解,很少有直接在代码中嵌入spring的事务管理代码...也就木有什么人回答你了

#3


引用 2 楼  的回复:
请设置log4j级别为debug
看看执行
  userMapper.insertUser(user);
  userMapper.insertUser(user);
时的sql语句
就我的理解,很少有直接在代码中嵌入spring的事务管理代码...也就木有什么人回答你了

我晕,都用配置文件的事务管理吗

#4


userMapper.insertUser(user);
  userMapper.insertUser(user);
这两个对象是同一个吧。
你最好这样用吧:
User user = new User();
User user2 = new User();
然后:
userMapper.insertUser(user);
  userMapper.insertUser(user2);
试试吧。

#5


引用 4 楼  的回复:
userMapper.insertUser(user);
  userMapper.insertUser(user);
这两个对象是同一个吧。
你最好这样用吧:
User user = new User();
User user2 = new User();
然后:
userMapper.insertUser(user);
  userMapper.insertUser(user……



我的理解是就算是同一个我也执行了2次啊

#6


你的理解没有问题,就算是同一个也应该是插入两次的,我这有做测试
就我个人的理解,用spring的目的就是奔其"配置文件或者注解的事务管理"
如果你在代码中写事务,要spring的意义不大吧,比写jdbc的事务还难理解

#7


    个人感觉是跟持久对象有关系,虽然你执行了2次但是是同一个对象 在持久对象中一种都是1一个对象。等事物commit的时候,就是提交持久对象的。
     如果你的数据相关,但是对象不是一样的,在持久对象中就是2对象,保存的时候,就是保持两个。
     你还可以测试一次在insert后面直接跟commit 可以肯定就能提交量对象了。

#8


引用 7 楼  的回复:
    个人感觉是跟持久对象有关系,虽然你执行了2次但是是同一个对象 在持久对象中一种都是1一个对象。等事物commit的时候,就是提交持久对象的。
     如果你的数据相关,但是对象不是一样的,在持久对象中就是2对象,保存的时候,就是保持两个。
     你还可以测试一次在insert后面直接跟commit 可以肯定就能提交量对象了。

mybatis哪里来的持久化对象....

#9


哪你告诉我在事物中的对象待处理的对象叫什么?不要跟hibernate的持久对象当一个概念理解好不?如果有一个人也姓邓 也叫小平 你怎么理解*这个人呢。。。。。

#1


自己顶

#2


请设置log4j级别为debug
看看执行
  userMapper.insertUser(user);
  userMapper.insertUser(user);
时的sql语句
就我的理解,很少有直接在代码中嵌入spring的事务管理代码...也就木有什么人回答你了

#3


引用 2 楼  的回复:
请设置log4j级别为debug
看看执行
  userMapper.insertUser(user);
  userMapper.insertUser(user);
时的sql语句
就我的理解,很少有直接在代码中嵌入spring的事务管理代码...也就木有什么人回答你了

我晕,都用配置文件的事务管理吗

#4


userMapper.insertUser(user);
  userMapper.insertUser(user);
这两个对象是同一个吧。
你最好这样用吧:
User user = new User();
User user2 = new User();
然后:
userMapper.insertUser(user);
  userMapper.insertUser(user2);
试试吧。

#5


引用 4 楼  的回复:
userMapper.insertUser(user);
  userMapper.insertUser(user);
这两个对象是同一个吧。
你最好这样用吧:
User user = new User();
User user2 = new User();
然后:
userMapper.insertUser(user);
  userMapper.insertUser(user……



我的理解是就算是同一个我也执行了2次啊

#6


你的理解没有问题,就算是同一个也应该是插入两次的,我这有做测试
就我个人的理解,用spring的目的就是奔其"配置文件或者注解的事务管理"
如果你在代码中写事务,要spring的意义不大吧,比写jdbc的事务还难理解

#7


    个人感觉是跟持久对象有关系,虽然你执行了2次但是是同一个对象 在持久对象中一种都是1一个对象。等事物commit的时候,就是提交持久对象的。
     如果你的数据相关,但是对象不是一样的,在持久对象中就是2对象,保存的时候,就是保持两个。
     你还可以测试一次在insert后面直接跟commit 可以肯定就能提交量对象了。

#8


引用 7 楼  的回复:
    个人感觉是跟持久对象有关系,虽然你执行了2次但是是同一个对象 在持久对象中一种都是1一个对象。等事物commit的时候,就是提交持久对象的。
     如果你的数据相关,但是对象不是一样的,在持久对象中就是2对象,保存的时候,就是保持两个。
     你还可以测试一次在insert后面直接跟commit 可以肯定就能提交量对象了。

mybatis哪里来的持久化对象....

#9


哪你告诉我在事物中的对象待处理的对象叫什么?不要跟hibernate的持久对象当一个概念理解好不?如果有一个人也姓邓 也叫小平 你怎么理解*这个人呢。。。。。