不可重复读和幻读之间有什么区别?
我已经阅读了维基百科的隔离(数据库系统)文章,但我有一些疑问.在下面的例子中,会发生什么:不可重复的读取和幻像读取?
交易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
SQL Server 使用“inserted”关键字提供插入和更新记录的输出。
我有一个代表处理队列的表。我使用以下查询来锁定记录并获取锁定记录的 ID:
UPDATE TOP (1) GlobalTrans
SET LockDateTime = GETUTCDATE()
OUTPUT inserted.ID
WHERE LockDateTime IS NULL
Run Code Online (Sandbox Code Playgroud)
这将输出一个名为 ID 的列,其中包含所有更新的记录 ID(在我的例子中为单个 ID)。如何将其转换为 C# 中的 EF 来执行更新并取回 ID?
我在Symfony中有一个应用程序,需要从该应用程序发送电子邮件/通知。由于电子邮件/通知发送过程需要时间,因此我决定将它们放入队列并定期处理队列。因此,我可以减少涉及电子邮件/通知调度的请求的响应时间。
用于处理队列的Cron Job(一个php脚本-Symfony路由)每30秒运行一次,并检查是否发现未发送的Email / Notifications是否从Queue Table获取所有数据并开始发送。发送电子邮件/通知后,“队列表”行状态标志将更新以显示已发送。
现在,当队列中有更多电子邮件时,可能需要30秒钟以上才能发送。另一个Cron作业也开始运行,并开始从队列发送电子邮件。因此导致重复发送电子邮件/通知。
我的电子邮件队列表结构如下:
|-------------------------------------|
| id | email | body | status | sentat |
|-------------------------------------|
Run Code Online (Sandbox Code Playgroud)
解决这个问题的想法如下:
所以我的问题是,是否有任何有效的方法来处理队列?是否有Symfony Bundle / Feature可以完成此类特定任务?
I'm implementing notifications using Spring Boot and notifying users in a different thread using @Async.
Without this annotation, everything works well, but for when I put it on the method I use to notify, in only one observable entity, the observers don't get notified and I get this stack trace:
Unexpected exception occurred invoking async method: public void pt.ulisboa.tecnico.socialsoftware.tutor.notifications.NotificationServic
e.notifyObservers(package.notifications.Observable,package.notifications.domain.Notification,ppackage.user.User)
org.hibernate.exception.GenericJDBCException: could not initialize a collection: [package.course.CourseExecution.users#11]
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:97) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:707) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final] …Run Code Online (Sandbox Code Playgroud) 作为学习练习,在尝试使用任何ORM(如EF)之前,我想使用ADO.NET和存储过程构建个人项目.
因为我不希望我的代码随着时间的推移变得混乱,我想使用一些模式,如存储库和UoW模式.
除了交易处理之外,几乎所有事情都已经解决了.
为了某种方式"模拟"一个UoW,我使用了@jgauffin 提供的这个类,但阻止我使用该类的是每次你创建该类的新实例(AdoNetUnitOfWork)时,你自动开始一个事务并且有很多您只需要读取数据的情况.
在这方面,这是我在我读过的一本SQL书中找到的:
在事务中执行SELECT语句可以在引用的表上创建锁定,这可以阻止其他用户或会话执行工作或读取数据
这是AdoNetUnitOfWork班级:
public class AdoNetUnitOfWork : IUnitOfWork
{
public AdoNetUnitOfWork(IDbConnection connection, bool ownsConnection)
{
_connection = connection;
_ownsConnection=ownsConnection;
_transaction = connection.BeginTransaction();
}
public IDbCommand CreateCommand()
{
var command = _connection.CreateCommand();
command.Transaction = _transaction;
return command;
}
public void SaveChanges()
{
if (_transaction == null)
throw new InvalidOperationException("Transaction have already been commited. Check your transaction handling.");
_transaction.Commit();
_transaction = null;
}
public void Dispose()
{
if (_transaction != null) …Run Code Online (Sandbox Code Playgroud) c# ×2
database ×2
ado.net ×1
asynchronous ×1
cron ×1
java ×1
mysql ×1
oracle ×1
php ×1
spring ×1
spring-boot ×1
sql ×1
sql-server ×1
symfony ×1
t-sql ×1
transactions ×1
unit-of-work ×1