数据库事务与OSP
2024-10-22 20:09:46 1 举报
AI智能生成
主要涉及数据库事务相关知识点与OSP开发过程中开启事务相关注意事项
作者其他创作
大纲/内容
事务特性
原子性(A)
要么全成功,要么全不成功,操作失败不能对数据库有任何影响
一致性(C)
数据从一种状态转变为另一种状态,且始终保持一致
A有1000元,与B交易过程中,无论发生多少笔,总金额始终为1000元
隔离性(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
OSP
链接获取
上下文获取
espContext.getConnection()
手动新建
JConnection.getInstance(po)
注意PO中数据库参数
po.SetValueByEnvName("DataBaseName", "flow_DB");
po.SetValueByEnvName("DBNO", "flow_DB");
po.SetValueByEnvName("DBNO", "flow_DB");
注意事项
1、上下文链接事务,若开启事务需注意异常回滚
SavePoint sp = connection.setSavepoint();
connection.rollerbak(sp);
connection.rollerbak(sp);
2、对外接口获取链接需进行关闭
服务中事务相关处理
依赖于上下文的提交
每个插件中对数据库的操作时,传递进去的数据库连接的事务模式是前面执行的插件设置的模式
若启用了事务,所有服务插件都没有提交操作,则在服务执行完之后,数据依旧保持原样
容器管理的自动提交
整个服务在开始执行时,数据库连接的事务模式被设置成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 条评论
下一页