Questions tagged «transactions»

一组相互关联的操作必须全部成功才能使它们中的任何一个成功。任何操作的失败都会导致事务中所有操作的回滚。

10
如何解决MongoDB中缺少事务的问题?
我知道这里也有类似的问题,但是如果我需要事务或使用原子操作或两阶段提交,它们要么告诉我切换回常规RDBMS系统。第二种解决方案似乎是最佳选择。第三,我不想跟进,因为看来很多事情可能出错,而且我无法在各个方面进行测试。我很难重构项目以执行原子操作。我不知道这是否来自我有限的观点(到目前为止,我仅使用SQL数据库),还是实际上无法完成。 我们想在我们公司试行MongoDB。我们选择了一个相对简单的项目-SMS网关。它使我们的软件可以将SMS消息发送到蜂窝网络,而网关则可以完成肮脏的工作:实际上是通过不同的通信协议与提供商进行通信。网关还管理消息的计费。每个申请该服务的客户都必须购买一些积分。发送消息时,系统自动减少用户的余额,如果余额不足,则拒绝访问。另外,由于我们是第三方SMS提供商的客户,因此我们也可能拥有自己的余额。我们也必须跟踪这些。 我开始考虑如果我降低了一些复杂性(外部账单,排队的SMS发送),如何使用MongoDB存储所需的数据。来自SQL世界,我将为用户创建一个单独的表,为用户创建另一个表,用于存储SMS消息,以及一个用于存储有关用户余额的事务的表。假设我为MongoDB中的所有数据库创建了单独的集合。 设想一下此简化系统中的SMS发送任务,其步骤如下: 检查用户是否有足够的余额;如果信用额不足,请拒绝访问 将消息以及详细信息和成本发送并存储在SMS集合中(在实时系统中,消息将具有status属性,任务将提取该消息进行传递,并根据其当前状态设置SMS的价格) 通过发送邮件的费用减少用户的余额 将交易记录在交易集合中 现在有什么问题吗?MongoDB只能对一个文档进行原子更新。在上一个流程中,可能会发生某种错误,消息已存储在数据库中,但用户的余额未更新和/或未记录交易。 我提出了两个想法: 为用户创建一个集合,并将余额存储为字段,将与用户相关的交易和消息存储为用户文档中的子文档。因为我们可以原子地更新文档,所以实际上解决了交易问题。缺点:如果用户发送许多SMS消息,则文档的大小可能会变大,并且可能会达到4MB的文档限制。也许我可以在这种情况下创建历史记录文档,但是我认为这不是一个好主意。另外,我不知道如果将越来越多的数据推送到同一个大文档中,系统将有多快。 为用户创建一个集合,为事务创建一个。可以有两种交易:余额更改为正的信用购买和余额更改为负的发送的消息。交易中可能有一个子文档;例如,在发送的消息中,可以将SMS的详细信息嵌入交易中。缺点:我不存储当前用户余额,因此每次用户尝试发送消息时都必须进行计算,以判断消息是否可以通过。恐怕随着存储的事务数量的增加,此计算可能会变慢。 我对选择哪种方法有些困惑。还有其他解决方案吗?在网上找不到关于如何解决此类问题的最佳实践。我猜想许多试图熟悉NoSQL世界的程序员在一开始就面临类似的问题。

12
修复“超过锁定等待超时;尝试重新启动事务”为“卡住”的Mysql表?
从脚本中,我将这样的查询发送了数千次到本地数据库: update some_table set some_column = some_value 我忘了添加where部分,因此同一列被设置为表中所有行的相同值,并且完成了数千次,并且对该列进行了索引,因此相应的索引可能被更新了太多次。 我注意到出了点问题,因为花了太长时间,所以我杀死了脚本。从那以后,我什至重新启动了计算机,但是表中有些东西卡住了,因为简单的查询需要很长时间才能运行,当我尝试删除相关的索引时,它失败并显示以下消息: Lock wait timeout exceeded; try restarting transaction 这是一个innodb表,因此卡住的事务可能是隐式的。如何修复该表并从中删除卡住的事务?


2
何时使用SELECT…FOR UPDATE?
请帮助我了解后面的用例SELECT ... FOR UPDATE。 问题1:以下是何时SELECT ... FOR UPDATE应使用的一个很好的例子吗? 鉴于: 房间[id] 标签[ID,名称] room_tags [room_id,tag_id] room_id和tag_id是外键 该应用程序要列出所有房间及其标签,但是需要区分没有标签的房间和已删除的房间。如果不使用SELECT ... FOR UPDATE,则可能发生以下情况: 原来: 房间包含 [id = 1] 标签包含 [id = 1, name = 'cats'] room_tags包含 [room_id = 1, tag_id = 1] 线程1: SELECT id FROM rooms; returns [id = 1] 线程2: DELETE FROM room_tags …


6
MySQL:事务与锁定表
我对事务与锁定表有些困惑,以确保数据库完整性,并确保SELECT和UPDATE保持同步,并且没有其他连接干扰它。我需要: SELECT * FROM table WHERE (...) LIMIT 1 if (condition passes) { // Update row I got from the select UPDATE table SET column = "value" WHERE (...) ... other logic (including INSERT some data) ... } 我需要确保没有其他查询会干扰并执行相同的操作SELECT(在该连接完成更新行之前读取“旧值”。 我知道我可以默认为LOCK TABLES table仅一次确保只有1个连接正在执行此操作,并在完成后将其解锁,但这似乎有点过头了。将事务包装在事务中是否会做同样的事情(确保没有其他连接会尝试同一进程而另一个仍在处理)?或将一个SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE更好?

3
在JPA / Hibernate中正确使用flush()
我正在收集有关flush()方法的信息,但是我不清楚何时使用它以及如何正确使用它。从我的阅读中,我的理解是持久性上下文的内容将与数据库同步,即发布未完成的语句或刷新实体数据。 现在,我得到下列设想两个实体A和B(在一比一的关系,而不是由JPA执行或模拟)。A具有手动设置的复合PK,还具有自动生成的IDENTITY字段recordId。这recordId应B作为的外键写入到实体A。我要存钱,A并且要B进行一次交易。问题是自动生成的值A.recordId是不是在事务内可用,除非我做的一个显式调用em.flush()打完电话后em.persist()上A。(如果我有一个自动生成的IDENTITY PK,那么该值将直接在实体中更新,但是这里不是这种情况。) 可以em.flush()在一个事务中使用时造成什么伤害?



4
为什么在Hibernate中需要事务才能进行只读操作?
为什么在Hibernate中需要事务才能进行只读操作? 以下事务是否在数据库中设置了锁定? 从数据库获取示例代码: Transaction tx = HibernateUtil.getCurrentSession().beginTransaction(); // why begin transaction? //readonly operation here tx.commit() // why tx.commit? I don't want to write anything 我可以session.close() 代替使用tx.commit()吗?


3
事务隔离级别与表上的锁的关系
我已经阅读了大约4个隔离级别: Isolation Level Dirty Read Nonrepeatable Read Phantom Read READ UNCOMMITTED Permitted Permitted Permitted READ COMMITTED -- Permitted Permitted REPEATABLE READ -- -- Permitted SERIALIZABLE -- -- -- 我想了解每个事务隔离对表的锁定 READ UNCOMMITTED - no lock on table READ COMMITTED - lock on committed data REPEATABLE READ - lock on block of …


2
TransactionScope如何回滚事务?
我正在编写一个集成测试,该测试将在数据库中插入许多对象,然后检查以确保我的方法是否检索到这些对象。 我与数据库的连接是通过NHibernate进行的,而创建此类测试的常用方法是执行以下操作: NHibernateSession.BeginTransaction(); //use nhibernate to insert objects into database //retrieve objects via my method //verify actual objects returned are the same as those inserted NHibernateSession.RollbackTransaction(); 但是,我最近发现了TransactionScope,显然可以用于此目的... 我发现的一些示例代码如下: public static int AddDepartmentWithEmployees(Department dept) { int res = 0; DepartmentAdapter deptAdapter = new DepartmentAdapter(); EmployeeAdapter empAdapter = new EmployeeAdapter(); using (TransactionScope …

12
我应该提交或回滚已读事务吗?
我有一个事务中执行的读取查询,以便可以指定隔离级别。查询完成后,该怎么办? 提交交易 回滚交易 不执行任何操作(这将导致事务在using块的末尾回滚) 进行每个操作有什么含义? using (IDbConnection connection = ConnectionFactory.CreateConnection()) { using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted)) { using (IDbCommand command = connection.CreateCommand()) { command.Transaction = transaction; command.CommandText = "SELECT * FROM SomeTable"; using (IDataReader reader = command.ExecuteReader()) { // Read the results } } // To commit, or not to …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.