Java 事务详解及简单应用实例
这里有新鲜出炉的 Java 并发编程示例, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 Java 事务详解及简单应用实例的相关资料, java 事务能够保证数据的完整性和一致性, 当然这是书本上的知识, 具体如何应用这里举例说明, 需要的朋友可以参考下
Java 事务的简单使用
Java 事务在一些面试中会被问到
面试的时候, 我们首先要回答的是: 事务能够保证数据的完整性和一致性
如果功力深厚点的话: 就说一些原理(任务开始前先设置不提交任务, 在所有任务完成后再提交任务,
如果任务在中间断开, 就执行回滚, 撤销前面执行的任务), 简单一点就举个的例子(比如存钱和取钱的问题
比如: 银行在两个账户之间转账, 从 A 账户转入 B 账户 1000 元, 系统先减少 A 账户的 1000 元, 然后再为 B 账号增加 1000 元如果全部执行成功, 数据库处于一致性; 如果仅执行完 A 账户金额的修改, 而没有增加 B 账户的金额, 则数据库就处于不一致状态, 这时就需要取消前面的操作)
本文对 java 事务做简单的探讨, 一问到 java 事务我们要知道这和数据库相关
一.先看一段简单的代码
使用 JDBC 方式进行事务处理
- public int delete(int sID) {
- // 实现数据库连接的类
- DataBaseConnection dbc = new DataBaseConnection();
- // 获取连接对象
- Connection con = dbc.getConnection();
- try {
- con.setAutoCommit(false); // 更改 JDBC 事务的默认提交方式
- dbc.executeUpdate("delete from xiao where ID=" + sID);
- dbc.executeUpdate("delete from xiao_content where ID=" + sID);
- dbc.executeUpdate("delete from xiao_affix where bylawid=" + sID);
- con.commit(); // 提交 JDBC 事务
- con.setAutoCommit(true); // 恢复 JDBC 事务的默认提交方式
- dbc.close();
- return 1;
- } catch(Exception exc) {
- con.rollBack(); // 回滚 JDBC 事务
- dbc.close();
- return - 1;
- }
- }
上面这一段代码就是一个比较简单的 java 事务的执行
上面三次执行删除操作, 只要有一次执行失败, 都会执行任务回滚, 相当于要么一起成功, 要么什么都没做
如果没有事务的管理, 前面执行了就会马上在数据库里面更新,
执行到哪里失败就退出不再执行后面的任务, 不能保证数据的一致性
二.Java 事务的基础概念
原子性(Atomicity) : 事务是一个完整的操作事务的各步操作是不可分的(原子的);
要么都执行, 要么都不执行
一致性(Consistency): 当事务完成时, 数据必须处于一致状态
隔离性(Isolation) : 对数据进行修改的所有并发事务是彼此隔离的, 这表明事务必须是独立的,
它不应以任何方式依赖于或影响其他事务
永久性(Durability) : 事务完成后, 它对数据库的修改被永久保持, 事务日志能够保持事务的永久性
java 的事务处理描述: 如果对数据库进行多次操作, 每一次的执行或步骤都是一个事务.
如果数据库操作在某一步没有执行或出现异常而导致事务失败, 这样有的事务被执行有的就没有被执行,
从而就有了事务的回滚, 取消先前的操作.....
在数据库操作中, 一项事务是指由一条或多条对数据库更新的 sql 语句所组成的一个不可分割的工作单元
只有当事务中的所有操作都正常完成了, 整个事务才能被提交到数据库, 如果有一项操作没有完成,
就必须撤消整个事务
例如在银行的转帐事务中, 假定张三从自己的帐号上把 1000 元转到李四的帐号上, 相关的 sql 语句如下:
- update account set monery=monery-1000 where name='zhangsan'
- update account set monery=monery+1000 where name='lisi'
这个两条语句必须作为一个完成的事务来处理只有当两条都成功执行了, 才能提交这个事务
如果有一句失败, 整个事务必须撤消
在 connection 类中提供了 3 个控制事务的方法:
(1) setAutoCommit(Boolean autoCommit): 设置是否自动提交事务;
(2) commit(); 提交事务;
(3) rollback(); 撤消事务;
在 jdbc api 中, 默认的情况为自动提交事务, 也就是说, 每一条对数据库的更新的 sql 语句代表一项事务,
操作成功后, 系统自动调用 commit()来提交, 否则将调用 rollback()来撤消事务
在 jdbc api 中, 可以通过调用 setAutoCommit(false) 来禁止自动提交事务
然后就可以把多条更新数据库的 sql 语句做为一个事务, 在所有操作完成之后, 调用 commit()来进行整体提交
倘若其中一项 sql 操作失败, 就不会执行 commit()方法, 而是产生相应的 sqlException,
此时就可以捕获异常代码块中调用 rollback()方法撤消事务
一般来说, 专门开发数据库的开发者肯定是要对事务了解很深入的,
但是一般的程序员不需要花费太多时间在这方面对大概作用有个理解就可以了
来源: http://www.phperz.com/article/18/0205/359273.html