ACID和数据库事务之间有什么关系?
ACID是否提供数据库事务还是同样的事情?
有人可以启发这个话题.
我正在使用CHASE银行.(还有美国银行),如果可以,我想得到我的银行交易和余额.那有API吗?在PHP或JAVA?如果是这样,请让我知道如何获得它们.
在C#.Net 2.0中进行事务的最佳实践是什么?应该使用哪些类?需要注意的缺陷是什么等等.所有提交和回滚的东西.我刚刚开始一个项目,我可能需要在将数据插入数据库时进行一些事务.任何有关交易的基本内容的回复或链接都是受欢迎的.
不可重复读和幻读之间有什么区别?
我已经阅读了维基百科的隔离(数据库系统)文章,但我有一些疑问.在下面的例子中,会发生什么:不可重复的读取和幻像读取?
交易A.SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
1----MIKE------29019892---------5000
Run Code Online (Sandbox Code Playgroud)
交易B.
UPDATE USERS SET amount=amount+5000 where ID=1 AND accountno=29019892;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
交易A.
SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
Run Code Online (Sandbox Code Playgroud)
另一个疑问是,在上面的例子中,应该使用哪个隔离级别?为什么?
database oracle transactions transaction-isolation isolation-level
我知道这里有类似的问题,但如果我需要事务或使用原子操作或两阶段提交,他们要么告诉我切换回常规RDBMS系统.第二种解决方案似乎是最佳选择.第三个我不想遵循,因为似乎很多事情都可能出错,我无法在各个方面进行测试.我很难重构我的项目来执行原子操作.我不知道这是否来自我有限的观点(到目前为止我只使用过SQL数据库),或者它是否真的无法完成.
我们想在我们公司试用MongoDB.我们选择了一个相对简单的项目 - 短信网关.它允许我们的软件向蜂窝网络发送SMS消息,并且网关执行肮脏的工作:实际上通过不同的通信协议与提供商进行通信.网关还管理消息的计费.申请服务的每个客户都必须购买一些积分.发送消息时,系统会自动降低用户的余额,如果余额不足,则拒绝访问.另外,由于我们是第三方SMS提供商的客户,我们也可能拥有自己的余额.我们也必须跟踪这些.
如果我减少了一些复杂性(外部计费,排队短信发送),我开始考虑如何用MongoDB存储所需的数据.来自SQL世界,我将为用户创建一个单独的表,另一个用于SMS消息,另一个用于存储有关用户余额的事务.假设我为MongoDB中的所有人创建了单独的集合.
想象一下SMS发送任务,在这个简化的系统中执行以下步骤:
检查用户是否有足够的余额; 如果没有足够的信用,请拒绝访问
使用详细信息和成本在SMS集合中发送和存储消息(在实时系统中,消息具有status
属性,任务将接收它以进行传递,并根据SMS的当前状态设置SMS的价格)
通过发送消息的成本减少用户的余额
在事务集合中记录事务
那现在有什么问题?MongoDB只能在一个文档上进行原子更新.在之前的流程中,可能会发生某种错误,并且消息会存储在数据库中,但用户的余额未更新和/或未记录事务.
我提出了两个想法:
为用户创建单个集合,并将余额作为字段,用户相关事务和消息存储为用户文档中的子文档.因为我们可以原子地更新文档,这实际上解决了事务问题.缺点:如果用户发送许多SMS消息,文档的大小可能会变大,并且可能达到4MB的文档限制.也许我可以在这种情况下创建历史文档,但我认为这不是一个好主意.另外,我不知道如果我将越来越多的数据推送到同一个大文档,系统会有多快.
为用户创建一个集合,为事务创建一个集合.可以有两种交易:具有正余额变化的信用购买和具有负余额变化的消息.交易可能有一个子文件; 例如,在发送的消息中,SMS的详细信息可以嵌入到事务中.缺点:我没有存储当前的用户余额,因此每次用户尝试发送消息时都要计算它,以判断消息是否可以通过.我担心随着存储事务数量的增加,这种计算会变慢.
我对选择哪种方法有点困惑.还有其他解决方案吗?我在网上找不到关于如何解决这些问题的最佳实践.我想许多试图熟悉NoSQL世界的程序员一开始就面临着类似的问题.
假设我有一个SQL语句,它在语法和语义上都是正确的,因此它会执行.
在Management Studio(或任何其他查询工具)中,我如何测试SQL语句,如果我注意到它们破坏了某些内容,则回滚(在单独的查询中?)
我不明白注释javax.transaction.Transactional
和实际区别是什么org.springframework.transaction.annotation.Transactional
?
是org.springframework.transaction.annotation.Transactional
延伸javax.transaction.Transactional
还是他们有完全不同的含义?应该何时使用它们?@Transactinal
服务层中的Spring 和DAO中的javax?
谢谢回答.
从脚本我发送了数千次这样的查询到我的本地数据库:
update some_table set some_column = some_value
Run Code Online (Sandbox Code Playgroud)
我忘了添加where部分,因此同一列被设置为表中所有行的相同值,这已经完成了数千次并且列已被索引,因此相应的索引可能更新了很多次.
我注意到有些事情是错的,因为它花了太长时间,所以我杀了剧本.从那时起我甚至重新启动了我的计算机,但是表格中存在一些问题,因为简单查询需要很长时间才能运行,当我尝试删除相关索引时,它会失败并显示以下消息:
Lock wait timeout exceeded; try restarting transaction
Run Code Online (Sandbox Code Playgroud)
这是一个innodb表,因此卡住交易可能是隐含的.如何修复此表并从中删除卡住的事务?
我正在收集有关flush()方法的信息,但我不清楚何时使用它以及如何正确使用它.根据我的阅读,我的理解是持久化上下文的内容将与数据库同步,即发出未完成的语句或刷新实体数据.
现在,我得到下列设想两个实体A
和B
(在一比一的关系,而不是由JPA执行或模拟).A
有一个复合PK,它是手动设置的,还有一个自动生成的IDENTITY字段recordId
.这recordId
应该B
作为外键写入实体A
.我正在保存A
并B
进行单笔交易.问题是自动生成的价值A.recordId
是不可用的事务中,除非我做的一个显式调用em.flush()
打完电话后em.persist()
上A
.(如果我有一个自动生成的IDENTITY PK,那么该值将在实体中直接更新,但这不是这里的情况.)
可以em.flush()
在一个事务中使用时造成什么伤害?
请帮我理解背后的用例SELECT ... FOR UPDATE
.
问题1:以下是SELECT ... FOR UPDATE
应该何时使用的一个很好的例子?
鉴于:
该应用程序希望列出所有房间及其标签,但需要区分没有标签的房间与已移除的房间.如果未使用SELECT ... FOR UPDATE,可能发生的情况是:
[id = 1]
[id = 1, name = 'cats']
[room_id = 1, tag_id = 1]
SELECT id FROM rooms;
returns [id = 1]
DELETE FROM room_tags WHERE room_id = 1;
DELETE FROM rooms WHERE id = 1;
SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id …