JDBC学习第三站之使用 Transaction 编程
2014-07-23 16:05
369 查看
1 1 事务的四大特性
事务是具备以下特征(ACID) 的工作单元:(1) 原子性
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。
原子操作,也就是不可分割的操作,必须 一起成功一起失败。
(2) 一致性
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。 这种特性称为事务的一致性。 假如数据库的状态满足所有的完整性约束, 就说该数据库是一致
的。
(3) 分离性
分离性指并发的事务是相互隔离的。 即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。
(4) 持久性
持久性意味着当系统或介质发生故障时, 确保已提交事务的更新不能丢失。 即一旦一个事务提交,DBMS 保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。
持久性通过数据库备份和恢复来保证。
2 事务处理三步曲
connection.setAutoCommit(false); // 把自动提交关闭 /*。。。。。。。*/ //正常的 DB 操作 //若没一条正常的操作语句都成功了 connection.commit() // 主动提交 // 若有一条 SQL 语句失败了,自动回滚 connection.rollback() // 主动回滚
//完整的代码片段:
try { con.setAutoCommit(false); //step ① 把自动提交关闭 Statement stm = con.createStatement(); stm.executeUpdate("insert into person(id, name, age) values(520, 'X-Man', 18)"); stm.executeUpdate("insert into Person(id, name, age) values(521, 'Super', 19)"); //step ② 正常的 DB 操作 con.commit(); //step ③ 成功主动提交 } catch(SQLException e) { try { con.rollback(); } catch(Exception e) { e.printStackTrace(); } //step ③ 失败则主动回滚 }
3 C JDBC 事务及事务隔离级别
JDBC 事务并发产生的问题:
① 脏读(D D irty R R eads s ) 一个事务读取了另一个并行事务还未提交的数据。② 不可重复读( Un Re peatable Read ) 一个事务再次读取之前的数据时,得到的数据不一
致,被另一个已提交的事务修改。
③ 幻读(Phantom Read ) 一个事务重新执行一个查询,返回的记录中包含了因为其它最
近提交的事务而产生的新记录。
为了避免以上三种情况的出现,则采用
事务隔离级别:
TRANSACTION_NONE 不使用事务TRANSACTION_READ_UNCOMMITTED 可以读取未提交数据
TRANSACTION_READ_COMMITTED可以避免脏读,不能够读取没提交的数据,最常用的隔离级别 大部分数据库的默认隔离级别
TRANSACTION_REPEATABLE_READ 可以避免脏读,不可以重复读取
TRANSACTION_SERIALIZABLE 可以避免脏读,不可重复读取和幻读, (事务串行化)会降低数据库效率
以 上 的 五 个 事 务 隔 离 级 别 都 是 在 Connection 类 中 定 义 的 静 态 常 量 , 使 用
setTransactionIsolation(int level) 方法可以设置事务隔离级别。
比如 :
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
4 事务实例
package JDBC_Study; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class TransactionDemo { public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // 动态导入数据库的驱动 Class.forName("com.mysql.jdbc.Driver"); // 获取数据库链接 conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jdbc_teaching", "root", ""); // 开启事务 conn.setAutoCommit(false); // 创造SQL语句 String sql = "INSERT INTO user_list ( user_name, user_password )VALUES ( 'Eric', '123' )"; // 执行SQL语句 stmt = conn.createStatement(); stmt.executeUpdate(sql); // 提交事务 conn.commit(); System.out.println("OK!"); } catch (Exception e) { e.printStackTrace(); // 回滚事务 try { conn.rollback(); } catch (Exception e2) { } } finally { // 关闭Statement try { stmt.close(); } catch (Exception e) { } // 关闭Connection try { conn.close(); } catch (Exception e) { } } } }
如有总结的不妥的地方,记得留言让小弟也学习学习
相关文章推荐
- 04-JDBC学习手册:JDBC中使用transaction(事务)编程和Javabean定义
- JDBC总结05-JDBC 中使用 Transaction 编程(事务编程)
- 20170205JDBC的学习第二天:PreparedStatement的使用、事务(Transaction)的学习
- 学习FPGA verilog的心得--编程技巧--如何写代码减少逻辑单元的使用数量
- spring学习笔记5——Spring里使用JDBC
- 学习使用J2EE Web应用的事件功能-Java基础-Java-编程开发
- JDBC编程学习笔记整理
- 学习JavaFX Script,第三部分:使用JAX-WS进行客户端-服务器通信
- MOSS Search学习记录(十):MOSS Visual How To使用SharePoint Server 2007搜索对象模型编程创建搜索查询
- Windows下DOS命令行使用和编程(学习记录)
- Java6学习笔记60——多线程编程——使用volatile保障原子性
- QQ界面编程,绝佳的学习材料(使用.NET)
- 学习如何使用 Cookie 编程
- UNIX环境高级编程学习之第十一章线程-使用条件变量
- Windows窗体编程基础学习:使用 NotifyIcon 组件向任务栏添加应用程序图标
- linux 编程之库的使用(学习笔记)
- Windows窗体编程基础学习:使用 NotifyIcon 组件向任务栏添加应用程序图标
- Windows窗体编程基础学习:使用 NotifyIcon 组件向任务栏添加应用程序图标
- 根据网友建议,决定使用以前为初学者设计的一个编程目标和学习的顺序来书写JavaEE教程
- Windows编程 C++ DLL编程 学习笔记(一)静态链接库的创建和使用