首页
学习
活动
专区
圈层
工具
发布

JDBC 事务的隔离级别(12)

数据库的隔离级别

1. 对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题

1)脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的

2)不可重复度:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取同一个字段,值就不同了

3)幻读:对于两个事务T1,T2,T1从一个表中读取了一个读取一个字段,然后T2在该表中插入了一些新的行,之后,如果T1再次读取同一个表,就会多出几行。

2. 数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题

3. 一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱

4.数据库提供的4种事务隔离级别:

隔离级别

描述

READ UNCOMMITED(读未提交数据)

允许事务读取未被其他事务提交的变更,脏读,不可重复读和幻读的问题都会出现

READ COMMITED(读已提交数据)

只允许事务读取已经被其它事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然可能出现

REPEATABLE READ(可重复读)

确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其它事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在

SERIALIZABLE(串行化)

确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其它事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下

5. MySql支持4种事务隔离级别,Mysql默认的事务隔离级别:REPEATABLE READ

在程序中设置隔离级别

代码语言:javascript
复制
import java.sql.*;

public class JDBCTest05 {
    public void myTest() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb";
        String sql = "SELECT balance FROM users WHERE id = ?";
        Connection connection = DriverManager.getConnection(url,"user","password");
        connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);// 设置隔离级别
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,1);
        ResultSet resultSet = preparedStatement.executeQuery();
        System.out.println(resultSet);
    }
}

在Mysql中设置隔离级别

1)每启动一个mysql程序,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量 @@tx_isolation 表示当前的事务隔离级别

2)查看当前的隔离级别:SELECT @@tx_isolation

3)设置当前mySQL连接的隔离级别:set transaction isolation level read committed

4)设置数据库系统的全局的隔离级别:set global transaction isolation level read committed

下一篇
举报
领券