Closed zhujiebing closed 1 year ago
触及到我知识盲区了, 不太懂.. 期待有缘人能解答你的问题.
是的,SQL Server 会对表进行锁定。在 SQL Server 中,锁是用于控制并发访问的一种机制。当一个事务对一个表执行写操作时,它会锁定该表,以防止其他事务同时进行写操作。同样,当一个事务对一个表执行读操作时,它也可以锁定该表,以防止其他事务修改该表。
SQL Server 采用多种锁定机制,包括共享锁、排他锁、行级锁等。这些锁定机制可以用来控制对表的并发访问,从而确保数据的一致性和完整性。
需要注意的是,如果一个事务长时间持有锁,那么其他事务可能会被阻塞,从而导致性能问题。因此,在设计应用程序时,需要谨慎地考虑锁定的使用,并确保尽可能地减少锁定的时间。
MySQL 和 SQL Server 在锁定表的方式上有所不同。在 MySQL 中,当使用默认的存储引擎 InnoDB 时,更新语句通常会使用行级锁来锁定更新涉及到的行,而不是锁定整个表。这种行级锁定机制可以最大程度地减少锁定的范围,从而提高并发性和性能。
具体来说,当一个事务对某些行进行更新时,MySQL 的 InnoDB 存储引擎会自动为这些行添加排它锁,以防止其他事务同时更新这些行。其他事务可以继续并发地读取表中的其他行,或者对其他未被锁定的行进行更新。这种行级锁定机制可以避免长时间的锁定表,从而提高并发性和性能。
需要注意的是,MySQL 的行级锁定机制并不是完全没有锁定表的情况。当一个事务需要对整个表进行更新或者锁定时,MySQL 仍然会使用表级锁定机制。此外,行级锁定也可能会导致死锁等问题,因此在使用时需要注意锁定的范围和时间,以避免性能问题和数据不一致等风险。
SQL Server 是支持行级锁定的。SQL Server 提供了多种锁定机制,包括共享锁、排它锁、行级锁等。其中,行级锁是用于控制对表中特定行的并发访问的一种机制。
在 SQL Server 中,行级锁定可以由多种方式实现,例如使用SELECT ... FOR UPDATE 或 SELECT ... WITH (UPDLOCK) 语句来显式锁定某些行,或者使用隐式锁定机制来自动锁定需要更新的行。具体来说,当一个事务对某些行进行更新时,SQL Server 会自动为这些行添加排它锁,以防止其他事务同时更新这些行。其他事务可以继续并发地读取表中的其他行,或者对其他未被锁定的行进行更新。
需要注意的是,与 MySQL 不同,SQL Server 的行级锁定机制可能会导致锁定范围更大、锁定时间更长等问题,从而影响并发性和性能。因此,在使用时需要注意锁定的范围和时间,并且需要根据具体情况进行优化,以避免性能问题和数据不一致等风险。
根据我问GPT大概感觉是sqlserver机制问题.
你可以尝试不要把@DS("mdm")
放在mapper上面,mapper在创建的时候会创建一个代理对象。 跟@DS("mdm")
可能会造成一些不必要的影响。
你把代码提交一下github,我去看看
@DSTransactional只会通过控制数据库连接手动提交来控制事务启停,并不会控制锁的粒度。sqlserver没了解过,但是mysql进行update时where条件没有索引,应该也会全表扫描加next-lock类似于锁表。可以参考下看一下sqlserver的机制
已解决,感谢。
ALTER DATABASE A SET READ_COMMITTED_SNAPSHOT ON;
select name, is_read_committed_snapshot_on from sys.databases;
开启Sqlserver的隔离级别 READ COMMITTED SNAPSHOT (已经提交读隔离) 跟默认的提交读有差异。
Please fill it out carefully, or it will be closed. 请认真填写,不然会直接关闭。
Enviroment
JDK Version(required): 17
SpringBoot Version(required): 2.6.8
dynamic-datasource-spring-boot-starter Version(required): 3.5.1
druid Version(optional): hikariCp: spring boot默认版本
Describe what happened
麻烦看一下这个问题,我在service方法使用@DSTransactional,对两个库的表进行update,master库(mySql)不会锁表,slave库(Sqlserver)会锁表
Expected Result: master库和slave库进行update都只触发行锁。
Actual Result: slave库的Receipt表触发了表锁,其它会话无法对这张表进行查询。 master库的mdm_model_pub表在update的时候,其它会话可以正常对这张表进行查询访问。
If there is an exception,or aop invalid,please attach the exception trace:
Steps to reproduce
Step 1
Step 2
Step 3