数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Hibernate 基于JDBC的事务[3]


发布日期:2021年09月14日
 
Hibernate 基于JDBC的事务[3]

Java代码

public class ClassA{

public void saveUser(User user){

session = sessionFactoryopenSession();

Transaction tx = sessionbeginTransaction();

sessionsave(user);

txcommit();

sessionclose();

}

}

public class ClassB{

public void saveOrder(Order order){

session = sessionFactoryopenSession();

Transaction tx = sessionbeginTransaction();

sessionsave(order);

txcommit();

sessionclose();

}

}

public class ClassC{

public void save(){

……

UserTransaction tx = new InitialContext()lookup(……);

ClassAsave(user);

ClassBsave(order);

txcommit();

……

}

}

public class ClassA{

public void saveUser(User user){

session = sessionFactoryopenSession();

Transaction tx = sessionbeginTransaction();

sessionsave(user);

txcommit();

sessionclose();

}

}

public class ClassB{

public void saveOrder(Order order){

session = sessionFactoryopenSession();

Transaction tx = sessionbeginTransaction();

sessionsave(order);

txcommit();

sessionclose();

}

}

public class ClassC{

public void save(){

……

UserTransaction tx = new InitialContext()lookup(……);

ClassAsave(user);

ClassBsave(order);

txcommit();

……

}

这里有两个类ClassA和ClassB分别提供了两个方法saveUsersaveOrder 用于保存用户信息和订单信息在ClassC中我们接连调用了ClassAsaveUser方法和ClassBsaveOrder 方法同时引入了JTA 中的UserTransaction 以实现ClassCsave方法中的事务性问题出现了ClassA 和ClassB 中分别都调用了Hibernate 的Transaction 功能在Hibernate 的JTA 封装中SessionbeginTransaction 同样也执行了InitialContextlookup方法获取UserTransaction实例Transactioncommit方法同样也调用了UserTransactioncommit方法实际上这就形成了两个嵌套式的JTA TransactionClassC 申明了一个事务而在ClassC 事务周期内ClassA 和ClassB也企图申明自己的事务这将导致运行期错误因此如果决定采用JTA Transaction应避免再重复调用Hibernate 的 Transaction功能上面的代码修改如下

[] [] [] [] []

               

上一篇:Hibernate 基于JDBC的事务[4]

下一篇:Hibernate 基于JDBC的事务[2]