最近在做oracle和sqlserver数据库兼容时发现公司老平台做历史变更记录时书写的代码纯在数据库兼容问题。

代码逻辑大致如下。先开启一个连接去更新数据库的一条记录,但是在提交之前开启另外一个连接去取未更新之前的记录。这在oracle中默认是允许的,但是在sqlserver2012中

则判断这是脏读会导致死锁。此代码这么写确实也不规范,应该先取出历史数据储存起来,再去更新。不过这个不同数据库的兼容问题确实挺蛋疼的。这也许就是体现经验价值的时候

吧。


测试代码

<%
	try{
		JdbcDAO dao = new JdbcDAO();
		Connection conn = dao.getConnection();
		conn.setAutoCommit(false);
		QueryHelper query = new QueryHelper(" update demo set xm = 'rrrr' where xh = '20170309114436a9f58b00c533460eaff5781f2b1cf40e' ");
		dao.executeSQL(conn,query);
		QueryHelper query1 = new QueryHelper(" select * from demo where xh = '20170309114436a9f58b00c533460eaff5781f2b1cf40e' ");
		dao.getSingleRow(null, query1);
		conn.commit();
		//201702271219517e0714a680c34c378919e976e3fe3d35
		//sql    20170309114436a9f58b00c533460eaff5781f2b1cf40e
	}catch(Exception e){
		e.printStackTrace();
	}
%>

sqlserver查询死锁和解锁语句


select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName 
from sys.dm_tran_locks where resource_type='OBJECT';


exec sp_who2 '69';
----解锁语句
declare @spid int
Set @spid = 76 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)


作者:星辰 时间:2017-03-09 浏览 640评论 0 赞 0砸 0 标签: oracle sqlserver
评论
还可以再输入500个字

请您注意

·自觉遵守:爱国、守法、自律、真实、文明的原则
·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·您在NoteShare上发表的作品,NoteShare有权在网站内保留、转载、引用或者删除
·参与本评论即表明您已经阅读并接受上述条款