数据库隔离级别:读未提交 Read Uncommitted
,读已提交(sqlserver 默认级别)read committed
,可重复读 Repeatable read
,串行化 Serializable
。
其中:读未提交:是读取数据时不申请任何锁,直接读取,可提升并发性能,但会脏读。
读已提交:是写锁直到事务结束释放来实现的。
可重复读:是读锁和写锁都在事物结束后释放。
串行化: 是所有事物串行处理。可解决幻读问题,但并发性能差。
查看当前事物隔离级别:DBCC Useroptions;
修改当前事物隔离级别:
set transaction isolation level <隔离级别>; --xxx可以为 Read Uncommitted、read committed、Repeatable read、Serializable
sqlserver只能更改当前连接的,不能全局改。
数据库死锁:
1.数据库中事物A锁定资源A,在不释放资源A的情况下申请资源B,同时事物B锁定资源B,在不释放资源B的情况下,申请资源A。这样就会形成死锁。
解决方案:
(1)事物对数据库表操作的顺序尽量保持一致。
2.高并发下操作同一条数据(隔离级别为Repeatable read
)
程序对数据库数据的修改通常都是先读取,再更新。当有两个事物同时操作同一条数据的时候,如果事物A获取了该条数据的读锁,准备申请写锁。同时事物B也获取了读锁,准备申请写锁。
应为事物隔离级别是Repeatable read
,事物A和事物B的读锁都不释放,导致事物A,B都无法获得写锁。这样就形成了死锁。
解决方案
(1)降低事物隔离级别。
(2)用版本号。给该条资源加版本号(只能降低概率)
(3)前端防止用户重复点击。
注:用行版本号机制可以增加数据并发性,同时减少死锁概率