mysql的事务隔离级别和JDBC

发布于:2024-05-11 ⋅ 阅读:(22) ⋅ 点赞:(0)
# 隔离级别和面临的问题事务等级 脏读 不可重复读 幻读
read uncommitted
read committed X
repeatable read X X
serializable X X X

事务的隔离级别越高,程序执行效率越低。

  • 脏读: 在一个事务中读取到了另一个未提交事务的数据,即为脏读

  • 不可重读读: 在一个事务处理过程中,另一个事物插入进来,并更新了数据,原先的事务前后两次相同的语句查询,结果不一样,即为不可重复读

  • 幻读: 在一个事物处理过程中,另一个事务插入进来,并更新了数据,此时原来的事务也插入数据,则实际上会受到后一个事务数据的影响,即为幻读。

-- 查询 mysql 事务隔离级别(5.7+)
SELECT @@transaction_isolation;
SET {SESSION | GLOBAL} TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE};

无论是 SESSION 还是 GLOBAL 级别,断开 MySQL 连接,下次再连接的时候,还是原来的事务隔离级别,因此彻底更新MySQL 事务隔离级别,需要修改 MySQL 配置文件

Linux 系统下 MySQL 配置文件位置为: /etc/my.conf

在 [mysqld] 标签下配置(在其他标签下设置无效,如果没有该标签则手动添加):

[mysqld]
transaction-isolation = READ-COMMITTED

在配置文件中设置的事务隔离级别为: READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALEZABLE,配置文件修改之后需要重启 MySQL 服务

MYSQL的JDBC

流程:

  1. 注册和加载驱动(可以省略)(导入mysql的jdbc的驱动库)(Class.forName(“com.mysql.jdbc.Driver”);)

  2. 获取连接

  3. Connection 获取 Statement 对象

  4. 使用 Statement 对象执行 SQL 语句

  5. 返回结果集

  6. 释放资源

DriverManager

静态方法 描述
Connection getConnection(String url, String user, String password) 通过连接字符串、用户名和密码获取数据库连接对象
Connection getConnection(String url, Properties info) 通过连接字符串和属性对象获取连接对象

Conection接口

Connection 作用:
Connection 接口,具体的实现类由数据库的厂商实现,代表一个连接对象。

Statement 作用:

代表一条语句对象,用于发送 SQL 语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。

方法 描述
int executeUpdate(String sql) 用于发送DML语句(增删改操作,如insert、update、delete),参数为SQL语句,返回值为对数据库影响的行数
ResultSet executeQuery(String sql) 用于发送DQL语句(执行查询操作,如select),参数为SQL语句,返回值为查询的结果集

释放资源

ResultSet结果集:在使用完ResultSet后,需要调用其close()方法来释放资源。这是因为ResultSet对象通常会占用较多的资源(如数据库连接),及时释放可以避免资源泄漏和内存占用过高。

ResultSet rs = statement.executeQuery(“SELECT * FROM table_name”);
// 使用ResultSet
rs.close(); // 释放ResultSet资源
Statement语句:对于Statement对象,同样需要调用其close()方法来释放资源。Statement对象代表了一个已经编译过的SQL语句,执行完SQL后应当立即释放资源,以便释放相关的数据库和JDBC资源。

PreparedStatement 是 Statement 接口的子接口,继承于父接口中所有的方法。它是一个预编译的 SQL 语句
stament每次都会被数据库编译,而用preparestatement只需要编译一次,只将参数传入。
没有sql注入风险。

Statement statement = connection.createStatement();
// 使用Statement执行SQL操作
statement.close(); // 释放Statement资源
Connection连接:最后,在完成与数据库的交互后,也需要及时释放Connection连接资源。确保在不再需要连接时及时关闭,以便释放数据库连接池和其他资源,并防止资源泄露。

Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/db_name”, “username”, “password”);
// 使用Connection执行数据库操作
connection.close(); // 释放Connection资源

session和连接和事务的关系

一个session(会话)执行一个事务,每个连接可以创建多个会话,每个会话可以执行其自己的SQL语句,并且可以管理自己的事务。


网站公告

今日签到

点亮在社区的每一天
去签到