引语:都知道数据库有锁机制,比如MySql的Innodb,提供读锁(S锁)和写锁(X锁),用户可通过SQL显示加锁执行,但直接使用锁在程序中使用是很麻烦的,所以数据库提供了自动锁机制。只要用户指定会话的事务隔离级别,数据库就会分析事务中的SQL,然后自动为事务操作加上适合的锁。
隔离级别 | 脏读 | 不可重复读 | 幻象读 | 第一类丢失更新 | 第二类丢失更新 |
---|---|---|---|---|---|
READ_UNCOMMITTED | 允许 | 允许 | 允许 | 不允许 | 允许 |
READ_COMMITTED | 不允许 | 允许 | 允许 | 不允许 | 允许 |
REPEATABLE_READ | 不允许 | 不允许 | 允许 | 不允许 | 不允许 |
SERIALIZABLE | 不允许 | 不允许 | 不允许 | 不允许 | 不允许 |
DEFAULT | 数据库默认 |
-- 查询数据库默认隔离级别
SELECT @@global.tx_isolation
注: Spring提供了很多便利的东西,不熟悉,不了解每个配置的作用,不可乱用,不然随时可能入坑!
注意,隔离级别是建立在并发的概念上的,也就是说在编程过程中,只有在考虑到并发的情况下才去做特殊的隔离机制设置!隔离机制跟并发的性能此起彼涨,业务上需要数据完整性的需要高隔离级别,业务上需要高性能的则需要适当降低隔离级别。但在一般的编程中,数据库的默认隔离机制就够用了!