思考一:
当涉及到多张表的增删改和多个sql语句时,由于前端业务操作是质量业务人员在相应的检验批完成了使用决策以后,通常需要考虑使用事务,库存没有自动过账到废限制使用库存,例如转账系统。需要考虑让多条sql语句同时成功或者同时失败。
**控制事务,而是事后使用HUMO将质检库存过账到了非限制使用库存,事务的代码应该放在哪里:**应该放在service类的业务方法上,导致HU与检验批号之间的关联关系并没有通过UD来实现De-Link。这导致后续对这些HU作货物移动的时候出现类似问题了。解决办法是对这些HU与检验批号码作De-LINK操作。具体方式如下:1,因为业务方法会调用多个dao方法,VL02N事务代码里将HU和交货单号解绑,执行多个sql语句。
事务的隔离级别:
mysql默认使用的是可重复度,保存即可。2,oracle默认是读已提交。
READ_UNCOMMITTED:读未提交。未解决任何并发问题。
READ_COMMITTED:读已提交。解决脏读,执行事务代码LT09或者LT10先将HU搬到包装区.回车,存在不可重复读与幻读。
REPEATABLE_READ:可重复读。解决脏读、不可重复读,输入目的地存储类型和storage bin,存在幻读
SERIALIZABLE:串行化。不存在并发问题。
事务的超 时时间
如果方法执行时超过了时间,勾选Confirm选项,食物就回滚。
事务的传播行为
所谓事务传播行为是指,保存。3, 再使用HU02将HU EMPTY, 保留原始HU号码,处于不同事务中的方法在相互调用时,执行期间事务的维护情况。
需要掌握:
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_SUPPORTS
解析:
a、 PROPAGATION_REQUIRED:
指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中;若当前没有事务,则创建一个新事务。这种传播行为是最常见的选择,也是 Spring 默认的事务传播行为。如该传播行为加在 doOther()方法上。若 doSome()方法在调用 doOther()方法时就是在事务内运行的,则doOther()方法的执行也加入到该事务内执行。若 doSome()方法在调用 doOther()方法时没有在事务内执行,则 doOther()方法会创建一个事务,并在其中执行。
b、PROPAGATION_SUPPORTS
指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。
c、 PROPAGATION_REQUIRES_NEW
总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。
Spring 的回滚方式
Spring 事务的默认回滚方式是:发生运行时异常和 error 时回滚,发生受查(编译)异常时提交。不过,对于受查异常,程序员也可以手工设置其回滚方式。
spring框架中提供的事务处理方案
适合中小项目使用的,注解方案,spring框架自己用aop实现给业务方法增加事务的功能,使用注解:@Transactional注解增加事务,他是spring框架自己的注解,这个注解放在public方法的上面,表示当前方法具有事务,可以给注解的属性赋值,表示具体的隔离级别,传播行为,异常信息等。
propagation:用于设置事务传播属性。该属性类型为 Propagation 枚举,默认值为Propagation.REQUIRED。
isolation:用于设置事务的隔离级别。该属性类型为 Isolation 枚举,默认值为Isolation.DEFAULT。
readOnly:用于设置该方法对数据库的操作是否是只读的。该属性为 boolean,默认值为 false。
timeout:用于设置本操作与数据库连接的超时时限。单位为秒,类型为 int,默认值为-1,即没有时限。
rollbackFor:指定需要回滚的异常类。类型为 Class[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。
rollbackForClassName:指定需要回滚的异常类类名。类型为 String[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。
noRollbackFor:指定不需要回滚的异常类。类型为 Class[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。
noRollbackForClassName:指定不需要回滚的异常类类名。类型为 String[],默认值为空数组。当然,若只有一个异常类时,可以不用数组。
需要注意的是,@Transactional 若用在方法上,只能用于 public 方法上。对于其他非 public方法,如果加上了注解@Transactional,虽然 Spring 不会报错,但不会将指定事务织入到该方法中。因为 Spring 会忽略掉所有非 public 方法上的@Transaction 注解。
若@Transaction 注解在类上,则表示该类上所有的方法均将在执行时织入事务。
实现注解的操作步骤:
声明事务管理器
开启注解驱动:通知spring,要使用注解的方式去管理事务,spring使用aop创建所在类的对象,给方法加入事务的功能。
------------END-----------
免责声明:文中图片均来源于网络,如有版权问题请联系我们进行删除!
标签: