事务隔离级别的语义:当前事务执行过程中,通过select,update,delete 操作,对其他事务的影响,反过来也是如此,通俗的说就是 当前事务是否可以看到其他事务的操作结果。
1、如何查询当前数据库的隔离级别(我们只讨论mysql的事务隔离级别)
select @@tx_isolation; SELECT @@session.tx_isolation; SELECT @@global.tx_isolation; //设置 set tx_isolation='read-committed';
2、不同隔离级别的影响
ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serializable)。
对于不同的事务,采用不同的隔离级别分别有不同的结果。不同的隔离级别有不同的现象。主要有下面3种现在:
1、脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。
2、不可重复读(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,可能被更新了(update),也可能被删除了(delete)。
3、幻像读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入操作(insert)的事务提交,导致每次返回不同的结果集。
不同的隔离级别有不同的现象,并有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差,4种事务隔离级别分别表现的现象如下表:
隔离级别 | 脏读 | 非重复读 | 幻像读 |
read uncommitted | 允许 | 允许 | 允许 |
read committed | 允许 | 允许 | |
repeatable read | 允许 | ||
serializable |
|
mysql 默认的隔离级别是:REPEATABLE-READ
注意:
1、repeatable read 允许幻读,这是ANSI/ISO SQL标准的定义要求,运行幻读依然有非常大的隐患,mysql 在repeatable read 即可满足没有幻读的要求。
2、不可重复读和幻读的区别:不可重复读的重点是修改,幻读的重点是插入或者删除了新数据。两都会造成系统错误,但是避免的方法则区别比较大,对于前者, 只需要锁住满足条件的记录,对于后者, 要锁住满足条件及其相近的记录。
举例验证:
1、建表
CREATE TABLE `t_pai` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
2、验证不存在幻读
client1 :SET autocommit= 0;
client2:SET autocommit= 0;
client1:START TRANSACTION;
client2:
START TRANSACTION;
INSERT INTO t_pai (`name`) VALUE ("2");
COMMIT;
client1:SELECT * FROM t_pai;
结果:查询不到数据:
client1:
COMMIT;
SELECT * FROM t_pai;
结果:有数据。
深层次的原理分析:
在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。
快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。
当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。
在一个支持MVCC并发控制的系统中,哪些读操作是快照读?哪些操作又是当前读呢?以MySQL InnoDB为例:
-
快照读:简单的select操作,属于快照读,不加锁。(当然,也有例外,下面会分析)
-
select * from table where ?;
-
-
当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。
-
select * from table where ? lock in share mode;
-
select * from table where ? for update;
-
insert into table values (…);
-
update table set ? where ?;
-
delete from table where ?;
所有以上的语句,都属于当前读,读取记录的最新版本。并且,读取之后,还需要保证其他并发事务不能修改当前记录,对读取记录加锁。其中,除了第一条语句,对读取记录加S锁 (共享锁)外,其他的操作,都加的是X锁 (排它锁)。
-
相关推荐
REPEATABLE-READ 即可重复读,set autocommit= 0或者START TRANSACTION状态下select表的内容不会改变。这种隔离级别可能导致读到的东西是已经修改过的。 比如: 回话一中读取一个字段一行a=1 在回话二里这个字段该行...
6. **事务处理**:支持各种事务隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。 7. **多版本并发控制**(MVCC):MySQL 8.0引入...
3. **事务支持**:支持JDBC的事务处理,包括读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)等隔离级别。 4. **结果集处理**:提供了处理查询结果的方法,可以将结果集转换为Java对象,如`ResultSet`。 ...
6. **事务处理**:支持多种事务隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。 7. **批处理操作**:允许一次发送多条SQL语句,...
6. **交易隔离级别**:在MySQL中,有四种交易隔离级别可供选择:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。根据描述,此精简包已经预设为...
2. **InnoDB增强**:默认事务隔离级别提升到Repeatable Read,提供更好的并发控制;支持自适应hash索引,能动态调整以优化查询性能。 3. **分区功能**:增强了对分区表的支持,允许更大规模的数据管理和分析。 4. ...
6. 全面的事务支持:包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)四种隔离级别。 7. 集成到应用服务器:可以无缝集成到诸如 Tomcat、JBoss...
7. **事务处理**:支持多种事务隔离级别,如 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE,满足不同应用场景的需求。 8. **结果集缓存**:通过 Result Set Caching,可以将查询结果缓存...
7. **事务特性**:支持各种事务隔离级别,如READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。 8. **异常处理**:封装了MySQL的错误代码和消息,转换为Java的SQLException。 9. **连接优化**:...
5. 交易隔离级别:支持可重复读(Repeatable Read)隔离级别,防止幻读问题,提高了并发事务处理的安全性。 二、Windows下的MySQL 5.6.45安装 1. 下载与解压:首先,从官方网站下载“mysql-5.6.45-winx64.zip”...
3. **事务支持**:MySQL Connector/J支持多种事务隔离级别,包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE,符合ACID(原子性、一致性、隔离性和持久性)原则,确保数据的一致性和完整性。...
7. **事务支持**:支持ACID(原子性、一致性、隔离性、持久性)特性,提供不同级别的事务隔离,如READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。 8. **多语种支持**:支持多种字符集,包括...
3. **事务处理**:支持JDBC的事务特性,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)四种隔离级别,以满足不同级别的数据一致性需求。...
- 支持更高级别的事务隔离级别(READ COMMITTED、REPEATABLE READ)。 - 新的JSON数据类型和操作,以及与NoSQL集成的能力。 总的来说,这两个驱动包提供了对不同版本MySQL数据库的Java连接支持,确保了与MySQL的...
1. 增强的事务隔离级别:支持可重复读(REPEATABLE READ)隔离级别的改进,减少幻读现象。 2. 嵌套事务:在同一个连接中可以开启多个事务,提高并发处理能力。 3. 全新的InnoDB表空间加密:为数据文件提供透明加密,...
除了传统的读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)四种隔离级别外,MySQL 8.0还提供了“可重复读”隔离级别的改进,称为“强一致读”...
2. 支持多种事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。 3. 自动重连:当网络故障导致连接中断时,驱动程序可以自动尝试重新建立连接。 4. 缓存 PreparedStatements:...
- 可重复读(RR)是MySQL的默认隔离级别,它可以防止脏读和不可重复读,但可能会出现幻读。在RR级别下,MySQL使用Next-Key Locks(包括行锁和间隙锁)来阻止幻读,确保事务内部的查询结果不会因为其他事务的INSERT...
REPEATABLE READ 隔离级别在 MySQL 中具有一个显著的特性,即它通过多版本并发控制(MVCC,Multi-Version Concurrency Control)机制来防止幻读,这是与 SQL 标准中 REPEATABLE READ 级别不同的地方。SQL 标准允许幻...