社区
MS-SQL Server
帖子详情
业务日志记录被回滚的问题
ohfox
2011-10-23 11:11:40
情况是这样的,公司的逻辑是在触发器中做一堆事情,然后最后成功或者回滚
我在这些逻辑中会通过一个公用sp记录很多的日志信息到一张审计表,可是万一最后触发器回滚了,我记录的那些信息也都被回滚了。
sqlserver没有自治事务的概念,google了下,方案是用CLR来实现,感觉有点复杂,能不能有简单的在T-SQL级别能搞定的方案?
比如用Service Broker之类的异步消息件能实现么? 或者别的方法,谢谢大家。
...全文
347
9
打赏
收藏
业务日志记录被回滚的问题
情况是这样的,公司的逻辑是在触发器中做一堆事情,然后最后成功或者回滚 我在这些逻辑中会通过一个公用sp记录很多的日志信息到一张审计表,可是万一最后触发器回滚了,我记录的那些信息也都被回滚了。 sqlserver没有自治事务的概念,google了下,方案是用CLR来实现,感觉有点复杂,能不能有简单的在T-SQL级别能搞定的方案? 比如用Service Broker之类的异步消息件能实现么? 或者别的方法,谢谢大家。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ohfox
2011-10-28
打赏
举报
回复
谢谢楼上各位
其实我本意是想实现sqlserver的自治事务,可以确保我的记录日志的信息不会因为外层的事务回滚而也消失。
2008已经有方法实现了,可是2005除了CLR好像还么google到好的方案。
gogodiy
2011-10-24
打赏
举报
回复
可以在存储过程里使用事务,将业务逻辑的操作和日志记录放在一起,要么一起成功,要么一起回滚。
--小F--
2011-10-23
打赏
举报
回复
SQL SERVER中只能调节数据库的隔离级别 而且只在当前事务生效
使用 最低级别的隔离级别试试
但是这样不能保证数据的安全性。
Mr_Nice
2011-10-23
打赏
举报
回复
[Quote=引用 3 楼 ohfox 的回复:]
触发器中并没有显示的begin tran,但遇到问题时会显示的rollback。
而且我想实现的是即使我的记录日志的sp是在触发器的begin tran 和 rollback之间的时候,我也能够成功的记录下我想要的调试信息,就是类似自治事务的概念了。
目前只google到了CLR的方法,感觉有点复杂,不知道有没有别的方法呢?
[/Quote]
触发器本身就是一个事务。 如果不论触发器是否正确执行,均需进行记录的话。LZ可以考虑前台做处理。而无须在触发器中处理。
如果需要用自治事务方式处理的话,LZ可以用
begin trans D1
begin trans G1
记录日志处理
end trans G1
begin trans T1
触发器中处理的那一堆
失败 rollback trans T1
end trans T1
end trans D1
-晴天
2011-10-23
打赏
举报
回复
如果是调试的话,你还不如用跟踪.
ohfox
2011-10-23
打赏
举报
回复
OrchidCat:
是的,我之前几乎不用触发器,可是现在代码框架就是这样,逼的我不得不去在触发器里面想一些绕过去的点子。想要彻底的弃用触发器,短期内几乎是不可能的....
ohfox
2011-10-23
打赏
举报
回复
触发器中并没有显示的begin tran,但遇到问题时会显示的rollback。
而且我想实现的是即使我的记录日志的sp是在触发器的begin tran 和 rollback之间的时候,我也能够成功的记录下我想要的调试信息,就是类似自治事务的概念了。
目前只google到了CLR的方法,感觉有点复杂,不知道有没有别的方法呢?
Mr_Nice
2011-10-23
打赏
举报
回复
貌似是处理逻辑的问题。触发器回滚,之前记录的日志也会回滚这块,好像需要调整。
另外,利用触发器做一堆事情,可能会带来不好的性能体现。
触发器对表的每一行都会处理一个事务, 长时间的增删改操作,小数据量没啥问题 ,数据多了就得要优化了。
-晴天
2011-10-23
打赏
举报
回复
触发器回滚也是在指定程序范围(begin tran 到 rollback tran 之间)语句内容的回滚,你把你写的东西放在begin tran前不就行了.
MySQL Binlog 八种应用场景
Binlog 是 MySQL 非常重要的服务器
日志
,它以事件的形式
记录
了数据库的改动。 大家能使用这些事件,应用在不同的场景上。 本课程将会带大家熟悉 Binlog 常用的八种应用场景, 分别为数据复制、数据修复、...
Spring
日志
切面方法中出现异常,防止
日志
记录
的
回滚
出现的
问题
:
业务
方法中出现异常,不能保存
日志
错误信息到数据库中
问题
思路:因为发生异常后,写入
日志
同样会事务
回滚
了,
日志
和
业务
方法是同一个事务 解决方案 将
日志
事务剥离出来当前方法事务,独立运行一个新的事务
日志
保存可以异步操作 将
日志
事务剥离出来当前方法事务,独立运行一个新的事务 背景:事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务应该如何进行。例如:methodA事...
Springboot事务
回滚
时设置
日志
不
回滚
解决方案一: 通过@Transactional(propagation = Propagation.NOT_SUPPORTED)注解的方式将
记录
日志
的方法跳过事务。 @Transactional(propagation = Propagation.NOT_SUPPORTED) public void recordLog(String logData) { //将
日志
存到数据库 } 解决方案二: 通过切面AOP方式
记录
日志
:Core Technologies ...
springboot(2.0)配置
日志
插入数据库,发生错误时脏数据
回滚
,
日志
不
回滚
。
springboot(2.0)配置
日志
插入数据库 github:配置
日志
插入数据库操作 项目名:springboot-jpa-aop-Log 注意事项和重点 新增方法不要加try catch做异常捕获,不然无法触发@AfterThrowing异常处理方法(或者创建新的异常让@AfterThrowing捕获,同时手动做
回滚
)TransactionAspectSupport.currentT...
spring事务
回滚
时
日志
的
记录
(@Async)
前言 项目中有推外部接口的统一方法,不管成功还是失败,都希望能被
记录
下来,且不是一般的
记录
,要把出入参返回值状态等接口参数都保存起来,以便于查询设置于补发,因此需要另建一个专用的接口请求表来
记录
。 一、
问题
代码大概如下 @Override public OpenApiResponseResult push(InparamVO inparamVO) throws BusinessException { try{ beforeLog(inpa.
MS-SQL Server
34,594
社区成员
254,589
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章