数据库事务

一、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控制事务的隔离级别

 

 

 

posted @ 2021-10-10 22:44  timelfb  阅读(115)  评论(0)    收藏  举报