数据库事务
一、MySQL中的事务
1.事务的概念
指逻辑上的一组操作,组成这个操作的各个单元,要么全部成功、要么全部失败。
2.Mysql中的事务
(1) Mysql引擎是支持事务的。
(2) Mysql默认是自动提交事务。每条sql语句都处在单独的事务中。
(3) 手动控制事务
① 开启事务:start transaction|begin
② 提交事务:commit
③ 回滚事务:rollback
二、JDBC控制事务
|
/** 显示修改操作 **/ // 1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获得数据库的连接 String url = "jdbc:mysql://127.0.0.1/hckj"; String user = "root"; String password = "root"; Connection conn = DriverManager.getConnection(url, user, password);
// 修改数据库默认自动提交的方式,需要操作conn对象 conn.setAutoCommit(false);
// 3.定义一个sql语句 String sql = "UPDATE account SET money=money+100 WHERE NAME=?"; // 4.通过conn对象得到PreparedStatement对象 PreparedStatement pst = conn.prepareStatement(sql); // 5.给?赋值 pst.setString(1, "张三"); // 6.执行DML操作 int count = pst.executeUpdate(); // 没有出现异常,直接提交事务 conn.commit(); try { new FileInputStream("/");
// 没有出现异常,直接提交事务 conn.commit();
} catch (IOException e) { e.printStackTrace();
// 出现异常情况,直接操作回滚 conn.rollback(); }
System.out.println("修改" + (count > 0 ? "成功" : "失败")); // 7.关闭资源 pst.close(); conn.close(); |
三、事务的特性(面试题)
事务的特性:ACID
1.原子性(Atomicity)
(1) 事务是一个不可分割的工作单元
(2) 事务中的操作要么都发生,要么都不发生
2.一致性(Consistency)
(1) 事务必须使用数据库从一个一致性状态变换到另外一个一致性状态
(2) 转账前和转账后的总金额不变
3.隔离性(Isolation)
(1) 事务的隔离性是多个用户并发访问数据库的时候
(2) 数据库为每一个用户开启事务,不会被其他事务的操作数据所干扰
(3) 多个并发事务之间要相互隔离
4.持久性(Durability)
(1) 指一个事务一旦提交,它对数据库的数据的改变是持久的
(2) 即使数据库发生故障也不应该对其收到影响
四、事务的隔离级别
错误读取方式:
1.脏读:指一个事务读取了另外一个事务未提交的数据
2.不可重复读:
(1) 在一个事务内读取表中的某一行数据,多次读取结果不同。
(2) 一个事务读取了另外一个事务提交后的数据(update操作)
3.虚读(幻读)
(1) 一个事务内读取到了别的事物插入的数据,导致前后不一致(Insert操作)
数据库可以通过设置事务的隔离级别来防止上面几种情况的发生
1.READ UNCOMMITTED(1):脏读、不可重复读、虚读都可能发生
2.READ COMMITTED(2):避免脏读。不可重复读、虚读都可能发生(Oracle默认的隔离级别)
3.REPEATABLE READ(4):避免脏读和不可重复读。虚读有可能发生(MySQL默认的隔离级别)
4.SERIALIZABLE(8):避免脏读、不可重复读、虚读。
级别越高,性能越低,数据越安全。
Mysql中查询数据库的隔离级别:
Select @@tx_isolation;
修改数据库隔离级别
五、JDBC控制事务的隔离级别


浙公网安备 33010602011771号