JDBC学习第三站之使用 Transaction 编程

来源:互联网 发布:mysql主键可以重复吗 编辑:程序博客网 时间:2024/05/19 10:37

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 {// 关闭Statementtry {stmt.close();} catch (Exception e) {}// 关闭Connectiontry {conn.close();} catch (Exception e) {}}}}

如有总结的不妥的地方,记得留言让小弟也学习学习
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老年人脚肿并痛怎么办 孩子蛙跳肌后大腿痛怎么办 走路久了腿酸怎么办 走路多了膝盖痛怎么办 走路多了小腿痛怎么办 走多了腿疼怎么办 小腿走多了酸痛怎么办 腿肚受凉了酸痛怎么办 晚上腿疼的睡不着觉怎么办 走路走多了腿酸怎么办 跳完蛙跳大腿疼怎么办 走路走多了脚疼怎么办 走太多路脚酸痛怎么办 走路走的腿酸痛怎么办 路走得太多腿疼怎么办 走路走的足弓疼怎么办 走路走多了膝盖怎么办 2岁宝宝走路一只脚内八字怎么办 6岁宝宝o型腿怎么办 一岁宝宝o型腿怎么办 宝宝一岁o型腿怎么办 宝宝一周两个月走路弓着腿怎么办 宝宝腿走路膝盖弯曲怎么办 两岁宝宝不爱走路怎么办 水鸭子脚不能走了怎么办 鸭子坐着脚走不动怎么办 鸭子步走了腿疼怎么办? 跳爵士舞没感觉怎么办 军校学员体能考核不达标怎么办 俯卧撑新兵连做不动怎么办 宝宝胆小不敢上体能课怎么办 28岁老太太抬头纹剩两颗怎么办 大腿前侧抽筋痛怎么办 电脑看片缓冲慢怎么办 跑步跑的腿疼怎么办 第一次去健身房练瑜伽不会怎么办 跑步过后腿筋疼怎么办 俯卧撑只能做20个怎么办 被裤裆峰咬了怎么办? 新兵5公里不想跑怎么办 老公掉粪坑了你怎么办