数据库事务与OSP
2024-10-22 20:09:46 0 举报
AI智能生成
主要涉及数据库事务相关知识点与OSP开发过程中开启事务相关注意事项
作者其他创作
大纲/内容
要么全成功,要么全不成功,操作失败不能对数据库有任何影响
原子性(A)
A有1000元,与B交易过程中,无论发生多少笔,总金额始终为1000元
数据从一种状态转变为另一种状态,且始终保持一致
一致性(C)
读未提交:一个事务读另一个事务还没有提交的数据。会产生脏读
读已提交:一个事务要等另一个事务提交后才能读取数据。保证了事务一致性,避免了脏读
可重复读:同一事务下,事务在执行期间,多次读取同一数据时,能够保证读取到的数据是一致的。
串行化:确保实现事务是依次串行执行的效果
事务读取了其他事务中未提交的数据
脏读
在重复读取某个数据时,该数据被其他事务修改并提交,导致数据不一致
不可重复读
重复查询数据集时,数据集数量已经被其他事务的执行而改变导致了数据不一致
幻读
在事务执行过程中,有可能出现的现象
隔离性(I)
事务一但提交后,数据的变更就是永久的
持久性(D)
事务特性
update TableA set A.a = 1 where A.b='2' for update
显式
update TableA set A.a = 1 where A.b='2'
隐式
对表中的某一行进行加锁,其他事务只能等待该行解锁后才能进行操作。
行级锁
update TableA set A.a = 1
对整个表进行加锁,其他事务不能对该表进行任何操作。
表级锁
select
多个事务只能读取数据,不能修改
共享锁
for update
只允许一个事务获取该锁,其他事务不允许做读写操作
排他锁
数据库锁
espContext.getConnection()
上下文获取
po.SetValueByEnvName(\"DataBaseName\
注意PO中数据库参数
JConnection.getInstance(po)
手动新建
链接获取
SavePoint sp = connection.setSavepoint();connection.rollerbak(sp);
1、上下文链接事务,若开启事务需注意异常回滚
2、对外接口获取链接需进行关闭
注意事项
OSP
若启用了事务,所有服务插件都没有提交操作,则在服务执行完之后,数据依旧保持原样
每个插件中对数据库的操作时,传递进去的数据库连接的事务模式是前面执行的插件设置的模式
依赖于上下文的提交
系统不会自动提交,若开启事务不提交则会回滚
整个服务在开始执行时,数据库连接的事务模式被设置成autocommit(true)
容器管理的自动提交
整个服务在开始执行时,数据库连接的事务模式被设置成autocommit(false)。待整个服务全部运行完毕,系统执行commit操作
容器管理的手动提交
整个服务组件在开始执行时,数据库连接的事务模式被设置成autocommit(false)。待这个服务组件下面的所有插件都执行完毕后系统自动执行commit操作
组件管理的提交方式
准备和执行阶段时的事务模式为手动提交,等待这两个阶段都执行完毕后系统会执行commit操作。结束阶段的事务模式为自动提交。
(准备+正式手动提交) +结束
准备阶段的数据库连接的事务模式为自动提交模式setAutoCommit(true)。执行阶段和结束阶段执行的数据库连接为手动提交模式setAutoCommit(false),等这两个阶段都执行完毕,系统会执行commit操作。
准备+(正式+结束手动提交)
服务中事务相关处理
见代码
案例
1、sql尽量简单,避免长sql,增大数据库压力
2、服务插件上下文中链接不要手动去关,手动创建链接一定要关闭
3、在业务开发过程中,如需记录接口日志,建议使用日志专用链接,防止因报错回滚无法记录
4、避免循环执行sql,使用批处理
5、查询语句避免select *,而是具体到个别需要字段
6、流程配置中,要么将更新数据全放在边上,要么全放在流程服务插件中,避免产生死锁
7、事务提交代码最好写在最外层方法
8、
操作注意事项(规范):
数据库事务
0 条评论
回复 删除
下一页