JDBC数据库事务(二):数据库的隔离级别

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

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

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

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

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


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


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


-Oracle 支持的2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 Oracle默认的事务隔离级别为: READ COMMITED。

-Mysql支持 4 中事务隔离级别,Mysql默认的事务隔离级别为: REPEATABLE READ。

5.在MySQL设置隔离级别

-每启动一个 mysql程序,就会获得一个单独的数据库连接。每个数据库连接都有一个全局变量 @@tx_isolation ,表示当前的事务隔离级别。 MySQL默认的隔离级别为 Repeatable Read

-查看当前的隔离级别: SELECT@@tx_isolation;

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

-设置数据库系统的全局的隔离级别: set global transaction isolation levelread committed;

6.隔离级别测试

public void testTransactionIsolationRead() {
    	String sql = "SELECT balance FROM users WHERE id = 1";
    	Integer balance = getForValue(sql);
    	System.out.println(balance); 
    }
    
    @SuppressWarnings("unchecked")
	public <E> E getForValue(String sql, Object... args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            connection = JdbcUtils.getConnection();
            //获取默认的隔离级别:connection.getTransactionIsolation()==4(TRANSACTION_REPEATABLE_READ)
            
            //connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);//读未提交
            connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);//读已提交
            
            preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            // 1. 得到结果集
            resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
            	// 2. 取得结果
                return (E) resultSet.getObject(1);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
        	JdbcUtils.closeResource(connection, null, preparedStatement, resultSet);
        }
        return null;
    }

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingzi123456789/article/details/80686261
个人分类: JDBC
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭