您的位置:首页 > 编程语言 > Java开发

Spring中注解: @Transactional 事务处理

2014-12-21 14:43 483 查看
Spring中注解: @Transactional 的属性说明

以下内容引自: /article/3862878.html

事务的传播属性 Propagation

Required PROPAGATION_REQUIRED

如果客户端已经包含在事务上下文中,则服务端加入客户端事务;如果客户端没有事务上下文,则

容器为服务端新启一个事务。

RequiresNew PROPAGATION_REQUIRES_NEW

如果客户端包含在事务上下文中,则容器采取如下步骤:

1. 挂起客户端事务;2. 启动一个新事务;3. 在新事务中完成服务端调用;4. 重启客户端事务;

如果客户端没有包含事务上下文,容器为服务端新启动一个事务.

Mandatory PROPAGATION_MANDATORY

如果客户端已经包含在事务上下文中,则服务端加入客户端事务;如果客户端没有事务上下文,则容器抛出异常TransactionRequiredException.

NotSupported PROPAGATION_NOT_SUPPORTED

如果客户端已经包含在事务上下文中,则容器挂起客户端事务,服务端不运行在事务上下文中,调用结束后容器重启客户端事务

Supports PROPAGATION_SUPPORTS

如果客户端已经包含在事务上下文中,则服务端加入客户端事务;如果客户端没有事务上下文,服务端不运行在事务上下文中.

Never PROPAGATION_NEVER

如果客户端已经包含在事务上下文中,则容器抛出异常RemoteException;服务端不启动事务;

PROPAGATION_NESTED

JDBC的SavePoint在应用层的体现,可以对某一部分操作单独commit/rollback.

事务的隔离级别 Isolation

事务的隔离级别是指并发的事务之间对同一数据进行读取或者修改时在多大程度上可以看到对方的结果。EJB和Spring都可以设置隔离的等级,但是这种设置严重依赖于底层数据库的支持。

TransactionReadUmcommitted ISOLATION_READ_UNCOMMITTED

事务之间可以访问对方已经修改但未commit的数据;

TransactionReadCommitted ISOLATION_READ_COMMITTED

事务之间只能访问对方已经commit的数据;

TransactionRepeatableRead ISOLATION_REPEATABLE_READ

保证同一个事务中读取的数据总是相同的,即本事务提交之前看不到其他事务对数据作的修改,即使其他事务已经

提交;

TransactionSerializable ISOLATION_SERIALIZABLE

对同一数据的修改只能顺序进行

注解可加在方法前,例如:

[java] view
plaincopy





/**

* 交易处理

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

@Override

@Transactional(rollbackFor={DrawCreditException.class},timeout = 30)

public Map drawCreditAmt(Map requestDataMap) throws Exception{

Map resultMap = new HashMap();

String acctNo = (String)requestDataMap.get("acctNo");

logger.info("交易请求处理开始-----acctNo="+acctNo);

//1 先对帐户进行加锁

creditAmtManagerSerive.lockAccount(acctNo);

logger.info("交易请求处理校验开始-----acctNo="+acctNo);

//2 查看客户当前是否有在处理中的交易请求,有则处理失败,无则进入

String checkLock = existsDrawCreditRequestOnWay(requestDataMap);

if(StringUtils.isNotEmpty(checkLock)){

resultMap.put("resultCode", PROCSS_FAIL);

resultMap.put("resultMsg", InterfaceReturnInfoUtils.ERROR_MSG_000003_DT2);

return resultMap;

}

//3 校验动用额度是否在可用额度范围内

String checkResult = checkDrawAmtInUsableRange(requestDataMap);

if(StringUtils.isNotEmpty(checkResult)){

resultMap.put("resultCode", PROCSS_FAIL);

resultMap.put("resultMsg", InterfaceReturnInfoUtils.ERROR_MSG_000002_DT11);

return resultMap;

}

logger.info("交易请求处理校验结束--acctNo="+acctNo);

try{

//4 更新可用余额(即从总的可用余额中减去本次交易金额)

creditAmtManagerSerive.updateCreditAmt(acctNo, TRX_TYPE_DB, new BigDecimal((String)requestDataMap.get("trxAmt")),new Date());

//5 异步调用交易功能

callDrawCreditAmtMethod(requestDataMap);

}catch(Exception e){

logger.info("帐户acctNo=["+acctNo+"]交易请求处理异常",e);

throw new DrawCreditException("帐户acctNo=["+acctNo+"]交易请求处理异常");

}

logger.info("交易请求校验结束,已放入交易队列,请等待执行结果--acctNo="+acctNo);

resultMap.put("resultCode", PROCESS_SUCCESS);

return resultMap; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: