你知道Django中使用的事务的默认隔离级别吗?是否可以以独立于数据库的方式设置隔离级别?
我主要对mysql和postgres感兴趣.
在postgresql 9.1中插入大量数据时.使用Python脚本,我们在此查询上收到以下错误:
X: psycopg2.ProgrammingError in /home/hosting/apps/X
X_psycopg.py:162 in : Execute 'execute' (
SELECT * FROM xml_fifo.fifo
WHERE type_id IN (1,2)
ORDER BY type_id, timestamp LIMIT 10
): out of shared memory
HINT: You might need to increase max_pred_locks_per_transaction
我们增加了这个数字但仍然没有共享内存(max_pred_locks_per_transaction = 192).每次我们再次启动脚本时它会运行一段时间,然后给出此错误消息.在Postgres 8.1上我们没有遇到这个问题.
这是postgresql日志文件的一部分:
2012-06-28 02:55:43 CEST HINT: Use the escape string syntax for backslashes, e.g., E'\\'. 2012-06-28 02:55:43 CEST WARNING: nonstandard use of \\ in a string literal at character 271 2012-06-28 02:55:43 CEST HINT: Use the escape string syntax …
有时需要对 Django 中的数据库操作使用比默认的“已提交读”更高的隔离级别。 文档警告说:
在更高的隔离级别下,您的应用程序应该准备好处理因序列化失败而引发的异常。
但是哪些特定的异常表示序列化失败,而不是查询或事务的一些其他问题?
序列化失败后的简单重试机制可能如下所示:
for retries in range(0, 3):
try:
with transaction.atomic():
MyModel.objects.update(foo='bar')
except StuffHappened:
continue
else:
break
Run Code Online (Sandbox Code Playgroud)
应该替换哪些特定异常,StuffHappened以便只有序列化失败而不是其他异常会导致重试?
Django 有多种数据库异常和事务异常。其中一个/一些可能代表序列化失败?
为此,我对 postgresql 特别感兴趣。
django postgresql transactions exception-handling isolation-level
Whats是MongoDB4.0使用事务时的默认隔离级别。
一份文档说 READ UNCOMMITTED 是默认隔离级别。https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/
另一篇文档说快照是使用事务时的默认隔离级别。 https://www.percona.com/blog/2018/06/25/mongodb-transactions-your-very-first-transaction-with-mongodb-4-0/
哪一个是正确的?可以改变吗?
我知道如果我们有多个并发用户, select_for_update 会锁定正在查询的记录。但是否也影响对查询记录的评估。
例如,如果用户 A 和用户 B 基于单个布尔变量“Available”同时查询表“Jobs”。两个用户都想访问可用职位的记录(其中Available = True)。
用户 A 设法先排队,并且他正在访问的记录现在已为用户 B 锁定。
如果用户A将所有记录都更改为False,那么用户B是否不会获取任何记录?或者他是否获得与用户 A 相同的记录,但可用性等于 False?
另外, select_for_update() 是否适用于 MySQL?或者对于并发查询有不同的解决方案吗?
我正在从以下链接研究SQL Server 2008的快照隔离级别.我的困惑是,
http://msdn.microsoft.com/en-us/library/ms173763.aspx
提到"当前事务开始后由其他事务进行的数据修改对当前事务中执行的语句不可见". - 其他事务提交的数据似乎对当前快照隔离级别事务不可见;
提到"在SNAPSHOT隔离级别下运行的事务可以查看该事务所做的更改." - 其他事务提交的数据似乎对当前快照隔离级别事务可见.
似乎1和2是冲突的?任何意见?
乔治,提前谢谢
我有一个在Tomcat 6中运行的Web应用程序,我已经设法将其配置为使用内置的DBCP连接池,并且一切都运行良好,但我怀疑它在数据库上运行在错误的隔离级别.我希望它以未提交的读取方式运行,但我认为它在read committed中运行,并且不知道如何设置它.
这是我的上下文的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true">
<Resource
name="jdbc/Connection"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
driverClassName="net.sourceforge.jtds.jdbc.Driver"
url="jdbc:jtds:sqlserver://...etc..."
/>
</Context>
Run Code Online (Sandbox Code Playgroud)
这是用于获取数据库连接的Java方法.
public Connection getDatabaseConnection() throws ServletException {
try {
InitialContext cxt = new InitialContext();
if ( cxt == null ) {
throw new ServletException( "ServletContext unavailable." );
}
DataSource ds = (DataSource)cxt.lookup( "java:/comp/env/jdbc/Connection" );
if ( ds == null ) {
throw new ServletException( "Data source not found!" );
}
Connection conn = ds.getConnection();
return conn;
} etc...
Run Code Online (Sandbox Code Playgroud)
获得连接之后, …
我在理解数据库(Oracle)中的读取一致性时遇到问题.
假设我是银行的经理.客户有锁(我不知道)并正在进行一些更新.现在,在他获得锁定后,我正在查看他们的帐户信息,并尝试对其进行一些操作.但由于读取的一致性,我会看到客户获得锁定之前存在的数据.那么这不会影响我得到的投入以及我将在那段时间做出的决定吗?
鉴于这种情况:
TIME TRANSACTION 1 TRANSACTION 2
1sec BEGIN
2sec INSERT RECORDS INTO T1
3sec (doing other things) BEGIN
4sec (doing other things) (doing other things)
5sec COMMIT (doing other things)
6sec SELECT * FROM T1 <<- GETS ROWS INSERTED BY T1
Run Code Online (Sandbox Code Playgroud)
根据postgres文档:
另请注意,如果其他事务在执行第一个SELECT期间提交更改,则两个连续的SELECT命令可以看到不同的数据,即使它们位于单个事务中
问题是:如何避免SELECT在事务开始和查询开始之间提交行.
我试图理解这些概念之间的关系。jpa锁是否是从Java在DB中提供/调用事务隔离级别的方法?还是它是分开的机制,所以有什么区别(它们的目的)?
isolation-level ×10
transactions ×5
postgresql ×3
concurrency ×2
django ×2
sql ×2
java ×1
jdbc ×1
jpa ×1
locking ×1
locks ×1
mongodb ×1
mysql ×1
mysql-python ×1
oracle ×1
python ×1
sql-server ×1
tomcat ×1