数据库中的事务就是一组数据库操作,具有几个特点:
1. 原子性,完整操作不可分割。
2. 一致性,数据保持一致。
3. 隔离性,并发事务彼此隔离,意思就是我做的时候,别人不能做,我做完了,别人才能做。
4. 永久性,对数据库的修改是永久保持的。
其中的原子性,就是把一组数据库操作当作一个完整不可分割的操作,举个例子,银行账户A向银行账户B转账,A中的金额减少,B中的金额增加,这两个操作必须当作一个完整不可分割的操作执行。
JDBC对事务管理的支持:
commit()提交操作
rollback()回滚操作
setAutoCommit(false)禁止自动提交
事务默认是自动提交的,在进行事务管理时,调用setAutoCommit()禁止自动提交,当事务操作失败或者出现异常时,调用rollback()回滚。
下面是慕课网上面的一个例子,我直接拿过来用了:
public String transaction(Account from, Account to, double amount) throws Exception{
Connection conn = DBUtil.getConnection();
//禁止自动提交
conn.setAutoCommit(false);
try{
AccountDao accountDao = new AccountDao();
TransDao transDao = new TransDao();
from.setAmount(from.getAmount() - amount);
accountDao.update(from);
//如果在期间出现由于其他程序引起的异常,导致下面的语句没有执行
String error = null;
error.split(" ");
to.setAmount(to.getAmount() + amount);
accountDao.update(to);
TransInfo info = new TransInfo();
info.setSourceAccount(from.getAccount());
info.setSource_id(from.getId());
info.setDestinationAccount(to.getAccount());
info.setDestinationId(to.getId());
info.setAmount(amount);
transDao.insert(info);
//手动提交操作
conn.commit();
return "success";
}catch(Exception e){
//回滚操作
conn.rollback();
e.printStackTrace();
return "false";
}
}
在执行上面的程序时,我们会发现,由于字符串error为null, 导致的空指针异常,这时候数据库执行回滚操作,保证了数据的正确。
以上就是JDBC事务管理的一个简单例子。