在数据库中,SERIALIZABLE(可串行化) 是事务隔离级别中最严格的一级,目的是让并发事务的执行结果等价于某种串行执行顺序。下面从“它如何生效”的角度系统说明。
多个事务并发执行,最终结果必须与“按某种顺序一个一个执行”的结果一致。
它要解决的是:
不同数据库实现方式不同,但本质机制有三类:
示例:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
SELECT * FROM account WHERE id = 1;
-- 对读取的数据加共享锁
UPDATE account SET balance = balance - 100 WHERE id = 1;
COMMIT;
特点:
✅ 优点:实现直观
❌ 缺点:并发低,容易锁等待、死锁
示例(PostgreSQL):
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT * FROM orders WHERE user_id = 1;
INSERT INTO orders(...) VALUES (...);
COMMIT;
-- 若与其他事务冲突,会报:
-- ERROR: could not serialize access due to concurrent update
✅ 优点:高并发
❌ 缺点:需要应用层处理重试
如何防止“别的事务插入符合条件的新数据”?
解决方案:
示例:
SELECT * FROM user WHERE age > 20;
SERIALIZABLE 下可能锁住:
要让 SERIALIZABLE 真正生效,必须注意:
-- 会话级
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 或事务级
BEGIN ISOLATION LEVEL SERIALIZABLE;
BEGIN / COMMIT很重要的一点:
SERIALIZABLE 保证的是 结果等价,不是执行顺序串行。
数据库仍可能:
适合:
不适合:
SERIALIZABLE 通过“锁 / MVCC 冲突检测 / 谓词锁”等机制,确保并发事务的结果等价于某种串行执行顺序,从而保证最强的一致性。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。