| # 隔离级别和面临的问题事务等级 | 脏读 | 不可重复读 | 幻读 | 
|---|---|---|---|
| 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语句,并且可以管理自己的事务。