事务
对事务的理解:由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成,如果事务过程中出错回滚事务
特点:
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
应用实例(手机银行后管用到)
private void register() {
log.debug("T0111Action execute Register begin ...");
RegisterBean bean = (RegisterBean) XMLParserUtil.parse(xmlContent);
Map<String, Object> params = new HashMap<String, Object>();
params.put("cardNo", bean.getCardNo());
params.put("cardType", bean.getCardType());
params.put("globalId", bean.getGlobalId());
params.put("globalType", bean.getGlobalType());
params.put("phoneNo", bean.getPhoneNo());
params.put("remark", bean.getRemark());
params.put("password", bean.getPassword());
params.put("custName", bean.getCustName());
params.put("custNum", bean.getCustNum());
params.put("birthDate", bean.getBirthDate());
params.put("adress", bean.getAdress());
params.put("gender", bean.getGender());
// yuxin add bankId
params.put("bankId", bean.getBankId());
try {
SysProperty sp = new SysProperty( Consts.SMS_KEY_IP, Consts.SMS_KEY_PORT );
sp.setMaxConn(20);
CardAuthManager.setAPIProperty( sp );
// 获取绑定短信令牌编号,该编号和用户进行绑定
String sms_key = CardAuthManager.getNewSMSCard(Consts.SMS_CARD_TYPE);
if (checkRegisterParams(bean, params)) {
//开启事务,到关闭事务之前是一个不可分割的工作单位,过程出错回滚
t0101Service.getIbatisDao().getSqlMapClient().startTransaction();
/**
* 客户信息保存到CUST_INFO表
*/
int custId = t0101Service.selectId("select SEQ_CUST_INFO.NEXTVAL FROM DUAL");
params.put("custId", custId);
params.put("orgId", bean.getOrgId());
params.put("regDate", DateUtil.todayStr());
params.put("sms_key", sms_key);
// 1) 向cust_info表中添加数据
t0101Service.insertByCust(params);
/*
* 变更主键,添加加挂帐号
*/
params.put("addChannel", "1");
params.put("addDate", DateUtil.todayStr());
String custNameStr = bean.getCardNo();
if (custNameStr.length() > 10) {
custNameStr = custNameStr.substring(custNameStr.length() - 4, custNameStr.length());
}
params.put("alias", custNameStr);
params.put("accName", getValue(params.get("custName")));
params.put("mainAcc", "1");
// 2) 向acc_info表中添加数据
t0101Service.insertByAcc(params);
// 保存操作日志记录
int logid = t0101Service.selectId("select SEQ_OPERATION_LOGS.NEXTVAL FROM DUAL");
this.saveOperLogs(loginService, logid, "", "客户签约", params.get("custName") +
"用户签约成功!签约账号为:" + bean.getCardNo(),
bean.getBankId());
t0101Service.getIbatisDao().getSqlMapClient().commitTransaction(); //提交事务
xmlStr = XMLParserUtil.makeResponseXmlStr("1", "签约成功", "000000", logid + "", "1");
}
} catch(Exception e) {
try {
t0101Service.getIbatisDao().getSqlMapClient().getCurrentConnection().rollback(); //出现异常回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
t0101Service.getIbatisDao().getSqlMapClient().endTransaction(); //事务结束
} catch (SQLException e) { e.printStackTrace(); } } log.debug("T0111Action execute Register end ..."); }