?
解决:提高隔离级别
SET TRANSACTIONISOLATIONLEVELSERIALIZABLE
?
此时【事务2】等待【事务1】完成。
事务1的运行结果2次都一样:
id name info
1 kk NULL
范围锁:范围锁处于与事务中执行的每个语句的搜索条件相匹配的键值范围之内。这样可以阻止其他事务更新或插入任何行,从而限定当前事务所执行的任何语句。这意味着如果再次执行事务中的任何语句,则这些语句便会读取同一组行。在事务完成之前将一直保持范围锁。这是限制最多的隔离级别,因为它锁定了键的整个范围,并在事务完成之前一直保持范围锁。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有SELECT语句中的所有表上设置HOLDLOCK相同。
?
?
如果在批处理中设置 REPEATABLE READ,并且该批处理调用一个将隔离级别设置为SERIALIZABLE的存储过程,则当该存储过程将控制返回给该批处理时,隔离级别就会恢复为REPEATABLEREAD。
?
| 并发事务引起的问题 |
|||
| 问题 |
描述 |
结果 |
解决 |
| 丢失更新 |
A读—B读—A改—B改 |
A更改丢失 |
READ UNCOMMITTED |
| 脏读 |
A改—B读—A回滚 |
B读无效值 |
READ COMMITTED |
| 不可重读 |
A读—B改—A读 |
A读不一致 |
REPEATABLE READ |
| 不可重读 |
A读—B改—A读 |
A读不一致 |
SNAPSHOT |
| 幻读 |
A读—B增删—A读 |
A读或多或少 |
SERIALIZABLE |
?