JDBC学习第三站之使用 Transaction 编程
来源:互联网 发布:mysql主键可以重复吗 编辑:程序博客网 时间:2024/05/19 10:37
1 1 事务的四大特性
事务是具备以下特征(ACID) 的工作单元:
修改操作要么全部执行,要么完全不执行。
原子操作,也就是不可分割的操作,必须 一起成功一起失败。
种特性称为事务的一致性。 假如数据库的状态满足所有的完整性约束, 就说该数据库是一致
的。
起来,不被其它企图进行修改的事务看到。
事务提交,DBMS 保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。
持久性通过数据库备份和恢复来保证。
(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) 方法可以设置事务隔离级别。
比如 :
如有总结的不妥的地方,记得留言让小弟也学习学习
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 {// 关闭Statementtry {stmt.close();} catch (Exception e) {}// 关闭Connectiontry {conn.close();} catch (Exception e) {}}}}
如有总结的不妥的地方,记得留言让小弟也学习学习
0 0
- JDBC学习第三站之使用 Transaction 编程
- 04-JDBC学习手册:JDBC中使用transaction(事务)编程和Javabean定义
- 05.JDBC编程之处理存储过程&Transaction
- JDBC总结05-JDBC 中使用 Transaction 编程(事务编程)
- JDBC之Transaction(事务)
- sharding-jdbc源码阅读之soft transaction
- JDBC Transaction
- SpringBoot学习笔记之JDBC使用
- JDBC之Transaction(事务),SetAutoCommit保证事务原子性
- java jdbc正确使用transaction 线程安全的TransactionManager
- JDBC编程学习
- JDBC编程之事务处理
- java编程之JDBC
- JDBC编程之事务处理
- Java8学习之旅2---基于Lambda的JDBC编程
- JDBC编程学习笔记之数据库连接池的实现
- mybatis学习之传统JDBC编程中的问题总结
- JDBC and JTP Transaction
- OSX 中为php安装 apc 扩展
- HADOOP介绍
- [Drools]JAVA规则引擎2 -- Drools实例
- C++程序设计之泛读概总
- hdoj 4548 美素数 【打表】
- JDBC学习第三站之使用 Transaction 编程
- jar包记录
- Android 压缩网络上的图片BitmapFactory.decodeStream()返回为空的问题
- 日期插件My97DatePicker
- Fragment保存状态
- 容器搜索算法:lower_bound, uper_bound
- 7.23 继续HTML内容及XHTML、CSS的学习
- [Drools]JAVA规则引擎 -- Drools
- ARM7启动代码,文字池