java 关于开启事务

2024-11-28 13:07:15
推荐回答(2个)
回答1:

可能模块的耦合太高,尽量让一个dao方法只执行单一的作用,不牵扯复杂的逻辑处理。逻辑处理交给service层进行实现。功能这边可能需要重新设计。先理清楚同事的代码逻辑,并把牵扯到的功能处理也给罗列出来。一个一个过。

回答2:

使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务; (细化处理逻辑,执行一段逻辑后便回滚或者提交,然后再执行其它逻辑,直到事物执行完毕提交) 一个请求处理过程可能会操作多条sql语句,那么保证原子性,必须把多条sql放到一个事务中执行,那么建议就是service层开启事务,通常DAO层都是执行一条sql语句不建议在DAO层开启事务。如银行转账就是一个典型的案例
假设张三给李四转账

如下代码(这是DAO层的代码)
public class MyDAO
{
1 //张三账户扣钱1000
public void m1()
{
//1、开启事务
//2、update Account set money=money-1000 where name='张三';
//3、提交事务
}
//思考:李四的钱还没有加上,如果李四账户的钱没有正确加上1000元呢?
2 //李四账户加钱1000
public void m2()
{
//1、开启事务
//2、update Account set money=money+1000 where name='李四';//假设这个地方出现异常???????
//3、提交回滚
}
//思考:本方法中李四的钱没有正确加上,但此时李三账户的钱已经扣钱.......现问题了。。。。。。。。。。
}
//根据上述的描述把事务开在DAO层显然是不合适的。。。。转账这个过程必须2条sql语句一起成功,才算是真正的成功...其中某一条sql出现问题转账就不能算是成功的。。。
--------------------------------------------------------------------------------------------------------
所以建议将事务开启在service层
如下代码:(业务逻辑层代码)
public class MyService
{
public void m1()
{
try{
//开启事务
MyDAO mdao=new MDAO();
mdao.m1();
mdao.m2();
//提交事务
}catch(Exception ex)
{
//回滚事务
}
}
}
-------------------------------------------------------------------------------------------------------------
造成死锁的原因,有可能是在程序中多次开启的事务,程序某些地方出现了异常,一些事务没有正确提交或回滚造成的死锁。具体还是要看代码来分析原因