要想太高自己的能力,就要在用这个东西点之前 ,思考:1.为什么要用它 2.它的优缺点是什么? 3.怎么用? 4.在什么场合用? 等问题,这样的话才不会让自己那么盲目的写,一味的用。。
Java中事务是什么?为什么要用事务?用什么技术处理?使用spring来管理事务的好处是什么?
1.首先要理解什么是事务?
事务:是访问数据库的一个操作序列,这些就是数据库特有的术语了。懒虫在这里口头解释:就是把多件事情当做一件事情来处理。也就是大家同在一条船上,要活一起活,要over一起over !
2.为什么要用事务?
首先,举个生活中的在平常不过的事情:
到银行存钱,于是有这么几个步骤:
1、把钱交给工作人员;2、工作人员填单;3、将单子给我签字;4、工作人员确认并输入电脑。
要是把钱交给工作人员之后,进行到3我签字了。那哥们突然心脏病发作,over掉了,那,我的钱还没有输入电脑,但我却交了钱又签字确认了,而并没有其他任何记录。我岂不是要亏死了???
于是,在数据库里产生了这么一个术语:事务(Transaction),也就是要么成功,要么失败,并恢复原状。
3.用什么技术处理?
刚开始的时候,我们是这样用的:
- try{
- conn=DriverManager.getConnection("jdbc:odbc:grade");
- defaultCommit=conn.getAutoCommit();
- conn.setAutoCommit(false);
- stmt=conn.createStatement();
- stmt.executeUpdate(strSQL1);
- stmt.executeUpdate(strSQL2);
- conn.commit();
- }
- catch(Exception e){
- conn.rollback();
- e.printStackTrace();
- }
- finally{
- conn.setAutoCommit(defaultCommit);
- if(stmt!=null){
- stmt.close();
- }
- if(conn!=null){
- stmt.close();
- }
- }
这里有一点非常重要,事务是基于数据库链接的。所以在但数据库的情况下,事务操作很简单。
那么如果表分布在两个不同的数据库中呢?
例如订单表在订单库中,库存表在库存库中,那么我们如何处理这样的事务呢?
需要注意,提交也可以遇到错误呀!
try{
Connection conn1 = getConnection1();
Connection conn2 = getConnection2();
// 基于conn1做插入操作
// 基于conn2做更新操作
try{
conn1.commit()
} catch(SQLExcetion ) {
conn1.rollback();
}
try {
conn2.commit();
} catch(SQLException ) {
conn2.rollbakc();
// 保证肯定删除刚才插入的订单。
}
} catch(SQLException ex) {
// 如果插入失败,conn1.rollback
// 如果更新失败,conn1.rollback && conn2.rollback
} finally {
conn1.close();
conn2.close();
}
看看上述的代码就知道,其实操作非常的复杂,甚至:保证肯定删除刚才插入的订单根本无法保证。
在上述情况下的事务可以称之为分布式事务,通过上述的代码中事务同时提交处理的部分我们可以得出,要想处理分布式事务,必须有独立于数据库的第三方的事务处理组件。
而Spring的失误处理,底层也就是这样的,只是spring的方式给程序员提供了便捷,AOP,让程序员不要在关心这些重复的try catch ,只需要关心业务代码。
4.使用spring来管理事务的好处是什么?
spring的方式给程序员提供了便捷,AOP,让程序员不要在关心这些重复的try catch ,只需要关心业务代码。
这个类:http://blog.csdn.net/without0815/article/details/7759050