你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。
数据库的四种隔离级别由低到高分别是:
读未提交(Read Uncommitted):事务可以读取其他未提交事务的数据,可能导致脏读问题,即读取到未提交的数据。
读已提交(Read Committed):事务只能读取其他已提交事务的数据,避免了脏读,但可能出现不可重复读,即同一事务中多次读取同一数据可能得到不同结果。
可重复读(Repeatable Read):确保在同一事务中多次读取同一数据结果一致,避免了不可重复读,但可能出现幻读,即在读取范围数据时,其他事务插入了新数据,导致前后读取结果不一致。
可串行化(Serializable):最高的隔离级别,通过对读取的数据行加锁,防止其他事务进行插入、更新或删除操作,避免了幻读,但可能导致性能下降和锁竞争。
脏读:一个事务读取了另一个未提交事务的数据,如果该数据被回滚,前者读取到的数据就是无效的。
不可重复读:在同一事务中,多次读取同一数据,结果可能不同,通常是因为其他已提交事务对该数据进行了更新。
幻读:在同一事务中,多次查询某个范围的数据,结果集可能不同,通常是因为其他已提交事务在该范围内插入了新数据。
以 MySQL 为例,可以使用以下命令设置事务的隔离级别:
-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 设置当前会话的隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
在 Java 中,使用 JDBC 可以通过 Connection 对象的 setTransactionIsolation 方法设置隔离级别:
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
选择隔离级别需要在数据一致性和系统性能之间权衡:
读未提交:几乎不使用,因为可能导致脏读。
读已提交:适用于对一致性要求不高,但需要避免脏读的场景。
可重复读:适用于需要确保同一事务中多次读取数据一致性的场景。
可串行化:适用于对数据一致性要求极高且并发量较低的场景。
数据库的默认隔离级别因数据库管理系统(DBMS)而异。以下是一些常见数据库的默认隔离级别:
MySQL:默认隔离级别为可重复读(Repeatable Read)。
CSDN博客
Oracle:默认隔离级别为读已提交(Read Committed)。
知乎专栏
SQL Server:默认隔离级别为读已提交(Read Committed)。
需要注意的是,不同的隔离级别在数据一致性和系统性能之间进行了不同的权衡。
今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!