# 隔离级别和面临的问题事务等级 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
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
流程:
注册和加载驱动(可以省略)(导入mysql的jdbc的驱动库)(Class.forName(“com.mysql.jdbc.Driver”);)
获取连接
Connection 获取 Statement 对象
使用 Statement 对象执行 SQL 语句
返回结果集
释放资源
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语句,并且可以管理自己的事务。