数据库的事务隔离级别越严格 , 并发副作用越?。?但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的 , 同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感 , 可能更关心数据并发访问的能力 。
为了解决“隔离”与“并发”的矛盾,ISO/ANSI SQL92定义了4个事务隔离级别,每个级别的隔离程度不同 , 允许出现的副作用也不同,应用可以根据自己业务逻辑要求,通过选择不同的隔离级别来平衡"隔离"与"并发"的矛盾
事务4种隔离级别比较
隔离级别/读数据一致性及允许的并发副作用读数据一致性脏读不可重复读幻读
未提交读(Read uncommitted)
最低级别,只能保证不读取物理上损坏的数据是是是
已提交度(Read committed)语句级否是是
可重复读(Repeatable read)事务级否否是
可序列化(Serializable)最高级别,事务级否否否
最后要说明的是:各具体数据库并不一定完全实现了上述4个隔离级别,例如,Oracle只提供Read committed和Serializable两个标准级别,另外还自己定义的Read only隔离级别:SQL Server除支持上述ISO/ANSI SQL92定义的4个级别外,还支持一个叫做"快照"的隔离级别,但严格来说它是一个用MVCC实现的Serializable隔离级别 。MySQL支持全部4个隔离级别,但在具体实现时,有一些特点 , 比如在一些隔离级下是采用MVCC一致性读,但某些情况又不是 。
获取InonoD行锁争用情况
可以通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况:
如果发现争用比较严重,如Innodb_row_lock_waits和Innodb_row_lock_time_avg的值比较高,还可以通过设置InnoDB Monitors来进一步观察发生锁冲突的表、数据行等,并分析锁争用的原因 。
InnoDB的行锁模式及加锁方法
InnoDB实现了以下两种类型的行锁 。
共享锁(s):允许一个事务去读一行 , 阻止其他事务获得相同数据集的排他锁 。
排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁 。
另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁 。
意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁 。
意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁 。
InnoDB行锁模式兼容性列表
如果一个事务请求的锁模式与当前的锁兼容 , InnoDB就请求的锁授予该事务;反之 , 如果两者两者不兼容,该事务就要等待锁释放 。
意向锁是InnoDB自动加的 , 不需用户干预 。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及及数据集加排他锁(X);对于普通SELECT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句 , InnoDB不会任何锁;事务可以通过以下语句显示给记录集加共享锁或排锁 。
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE
用SELECT .. IN SHARE MODE获得共享锁,主要用在需要数据依存关系时确认某行记录是否存在 , 并确保没有人对这个记录进行UPDATE或者DELETE操作 。但是如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT ... FOR UPDATE方式获取排他锁 。
推荐阅读
- 用什么拍摄手绘照片,手绘怎么拍摄
- 荣耀路由器怎么改速率单位,荣耀路由器如何更改信道
- 即时战略游戏开黑教程图片,即时战略游戏开黑教程图片
- mongodb配置文件auth,mongodb配置文件设置超时时间
- c语言定义最小公倍数函数 c语言最小公倍数流程图
- wordpress添加js文件,wordpress jquery
- erp系统与兄弟车间怎样衔接,erp系统与兄弟车间怎样衔接起来
- 广西海鲜鱼类直播网红,广西海鲜养殖基地
- vb.net对象相同 vb中对象名是什么