spring 事务 sqlserver 锁表问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 事务 sqlserver 锁表问题相关的知识,希望对你有一定的参考价值。

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<tx:advice id="txAdvice_new"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRES_NEW"
rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
---------------------------------
<aop:config proxy-target-class="true">
<aop:pointcut id="mrpboMethods"
expression="execution(*hj.nerp.prod.bo.impl.MRPBOImpl.*(..))" />
<aop:advisor advice-ref="txAdvice_new"
pointcut-ref="mrpboMethods"/>
</aop:config> 我在该service层中,调用dao层进行查询,查询后会有一部分时间进行运算,再需要插入其他表中,这样的时候可能会比较长,在该运算中,我查询了其他业务中涉及的表,当我对其他涉及表业务进行操作的时候,那些业务将不能进行操作了,直到该运算结束。是否表示在service层中加入事务,在该层中即使调用dao层中的查询表也会被锁定?如果我需要对这些只进行查询的表不进行锁定,怎么处理?

方案一:
可以将查询的代码单出去,新建立一个方法包含它们,在原来的service方法中调用它就好,然后在配置事务时,注意别把这个方法加上事务内。

方案二:
将sqlserver的事务级别下降一个级别,别造成锁表。sqlserver支持锁行的。追问

方案一中 是说将事务建立在整个service类中的啊,怎么除去哪个方法不加事务呢
方案二中是在事务中加 隔离级别 直接进行改,还是直接改变数据库

追答

在添加一个节点,
propagation属性值为PROPAGATION_NOT_SUPPORTED。以非事务的方式运行。

还是推荐使用第一个方案吧。
第二个方案还得动用DBA。

参考技术A 换最新的驱动试试

不然换 jtds 驱动试试

Sqlserver各种数据库的锁表和解锁操作

SqlServer 查询被锁住的表和解锁表

 

--1.查看被锁表 
SELECT request_session_id as spid,OBJECT_NAME(resource_associated_entity_id) as tableName FROM sys.dm_tran_locks WHERE resource_type=OBJECT 
--spid   锁表进程 ;tableName   被锁表名 
--2.解锁 
declare @spid  int  Set @spid  = 被锁表的进程号 declare @sql varchar(1000) set @sql=kill +cast(@spid  as varchar) exec(@sql)

 

Oracle 查询被锁住的表和解锁表

--1.锁表查询的代码有以下的形式: 
SELECT count(*) FROM v$locked_object; SELECT * FROM v$locked_object; 
--2.查看哪个表被锁 
SELECT b.owner,b.object_name,a.session_id,a.locked_mode FROM v$locked_object a,dba_objects b WHERE b.object_id = a.object_id; 
--3.查看是哪个session引起的 
SELECT b.username,b.sid,b.serial#,logon_time FROM v$locked_object a,v$session b WHERE a.session_id = b.sid order by b.logon_time;  
--4.杀掉对应进程 
alter system kill session1025,41; 
--其中1025为sid,41为serial#.

 

以上是关于spring 事务 sqlserver 锁表问题的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver跳过锁表等待

事务隔离级别,为什么SQLSERVER 容易锁表

.net的sqlserver事务里,delete语句如何只锁行,不锁表

sqlserver锁表机制

SqlServer查看锁表与解锁

怎样查询出SQLSERVER被锁的表,以锁表的SQL语句