这是我的完整类,它有两个方法,一个用于插入,另一个用于更新。插入方法已成功插入,我可以看到表中的记录,但在update方法中获取,尽管表中存在数据记录,但仍返回null。
@Repository
@Transactional
public class MyApplicationDAOImpl implements MyApplicationDAO {
@Autowired
private SessionFactory sessionFactory;
// Insert Method
public boolean insertUpdateMyData(Long Key,String message)throws Exception {
Session session = sessionFactory.getCurrentSession();
MyData data = new MyData();
data.setKey(Key);
data.setMessage(message);
session.saveOrUpdate(data);
return true;
}
//This is update method
@Override
@Transactional(isolation = Isolation.SERIALIZABLE,propagation = Propagation.REQUIRES_NEW)
public boolean updateMyData(Long Key,
String new_message)throws Exception {
Session session = sessionFactory.getCurrentSession();
MyData data = (MyData) session.get(MyData.class,Key,LockMode.UPGRADE);
if(data != null)
{
data.setMessage(new_message);
sessionFactory.getCurrentSession().update(data);
session.flush();
return true;
}
else
{
session.flush();
return false;
}
}
}
答案 0 :(得分:0)
鉴于insertUpdateMyData上没有@Transactional,我只假设您有一些顶级方法,如...
@Transactional
public void upperLevelMethod() {
Key key = getKeyFromSomewhere();
String message = getMessageFromSomewhere();
insertUpdateMyData(key, message);
String newMessage = getNewMessageFromSomewhere();
updateMyData(key, newMessage);
}
upperLevelMethod
将创建一个insertUpdateMyData
将继承的交易(交易A),然后updateMyData
将创建一个全新的交易(因为您有requires_new,我们称之为交易B)。由于事务A在事务B启动时未提交,事务B具有序列化级别隔离,这意味着事务B不会看到事务A所做的任何更改。
您需要在调用insertUpdateMyData
之前提交updateMyData
使用的事务,或者更改updateMyData
以继承相同的事务。