Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Squeryl中设置事务隔离级别

在Squeryl中设置事务隔离级别
EN

Stack Overflow用户
提问于 2011-11-25 10:08:41
回答 2查看 1.7K关注 0票数 3

如何使用Squeryl设置事务隔离级别?

例如,现在我正在使用Postgresql,需要对特定的单个事务进行可序列化的隔离。我使用普通的Squeryl和Squeryl-记录与电梯网络框架。

当然,对于整个会话(而不是单个事务)的其他数据库,其他数据库可能需要其他隔离级别,因此更可取的是一般的答案。

更新:

最后,我得到了代码的修改版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def transactionWith[T](isolation: Int)(block: => T): T =
  transaction {
    val connection = Session.currentSession.connection
    connection.rollback // isolation cannot be changed in the middle of a tx
    connection.setTransactionIsolation(isolation)
    block
  }

问题是,如果事务已经启动,则不能更改隔离级别。对我来说是这样,如果没有回滚,我会得到:

org.postgresql.util.PSQLException:无法更改事务中间的事务隔离级别。

只要我使用的是事务{}而不是inTransaction{},我认为立即回滚不会有什么害处。

在事务{}提交或回滚之后,但在连接返回到连接池之前,应重置隔离级别。我不知道该怎么做。但在我的示例中,c3p0连接池似乎重置了隔离级别,每个事务{}都以默认隔离级别启动,即使我自己从未清理过它们。

我不太高兴的是,当有冲突的时候。我想专门捕获这样的异常并重试事务。但这只是一个一般的运行时异常:

java.lang.RuntimeException:执行语句时的异常:错误:由于并发更新,无法序列化访问

它封装了另一个异常,不幸的是,它也是泛型的(org.postgresql.util.PSQLException)。

这并不完美,但在Squeryl有望获得事务隔离支持之前,它就能完成这项工作。我使用了上面的代码与Squeryl 0.9.4。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-25 15:03:28

现在,这将是一个有点手动的过程。如果整个会话都需要它,那么我想您可以简单地在SessionFactory中设置适当的级别,即

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SessionFactory.concreteFactory = Some(()=> {
  val connection = java.sql.DriverManager.getConnection("...")
  connection.setTransactionIsolation(...)
  Session.create(connection, new PostgreSqlAdapter)
 })

对于单个事务来说,这会稍微困难一些。您可以使用Session.currentSession或Session.currentSessionOption访问当前会话,并且必须在事务发生之前设置隔离级别,然后再将其设置回。当然,创建您自己的函数并不太困难,因为它就是这样做的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def transactionWith(isolation: Int)(block: => T): T = {
  trasaction{
    val connection = Session.currentSession.connection
    val oldIsolation = connection.getTransactionIsolation()
    connection.setTransactionIsolation(isolation)
    try {
      block
    } finally {
      connection.setTransactionIsolation(oldIsolation)
    }
  }
}

然后你就会把它当作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
transactionWith(Connection.TRANSACTION_SERIALIZABLE){
   from(blablabla)(......)
}

我认为这是可行的,但是( a)我不完全确定何时应该设置隔离级别,我假设在执行任何其他语句之前在当前事务中设置隔离级别将有效;( b)我没有尝试编译上面的内容,因此可能会出现语法错误。不管怎么说,我想这会给你一个大致的想法。

票数 3
EN

Stack Overflow用户

发布于 2012-04-03 15:43:50

关于异常:org.postgresql.util.PSQLException扩展了java.sql.SQLException,它有一个getSQLState()方法。这种序列化失败导致的异常将从此方法返回"40001"

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8272848

复制
相关文章
mysql设置隔离级别_修改mysql事务隔离级别
Mysql默认的事务隔离级别是可重复读(Repeatable Read),那互联网项目中Mysql也是用默认隔离级别,不做修改么?
全栈程序员站长
2022/10/02
2.7K0
mysql设置隔离级别_修改mysql事务隔离级别
oracle事务隔离级别_mysql查看事务隔离级别
通常事务的隔离级别定义为以下4种(基于3种在并发事务中需要避免的现象来划分的):
全栈程序员站长
2022/11/04
1.8K0
事务隔离级别
  MySQL是一个 客户端/服务器 架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每 个客户端与服务器连接上之后,就可以称为一个会话( Session )。每个客户端都可以在自己的会话中 向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理 多个事务。事务有 隔离性 的特性,理论上在某个事务 对某个数据进行访问 时,其他事务应该进行 排 队 ,当该事务提交之后,其他事务才可以继续访问这个数据。但是这样对 性能影响太大 ,我们既想保持 事务的隔离性,又想让服务器在处理访问同一数据的多个事务时 性能尽量高些 ,那就看二者如何权衡取 舍了。
一个风轻云淡
2022/11/15
8050
事务隔离级别
聊聊PG中事务隔离级别
数据库中的现象 Lost Updates现象:两个事务同时并发更新一个行数据,第一个事务更新完毕后,第二个事务没有考虑第一个事务的任何变更而进行数据变更的问题。比如A、B事都做转账10元给X账户操作,A事务在账户X(已有1元)完成转账这时候X账户有11元,而B事务这是开始转账读取X账户的11元,在转账1元,这时候X账户有12元,整个过程客户丢失了1元 Dirty Reads and Read Uncommitted现象:一个事务读取另外一个事务未提交的事务的数据这个就是脏读 Non-Repeatab
用户4700054
2023/02/26
5250
聊聊PG中事务隔离级别
MySQL中的事务隔离级别
事务最经典的、经常被拿出来说的例子就是转账了。假如小花要给小白转账1000元,这个转账会涉及到两个关键操作就是:将小花的余额-1000,将小白的余额+1000。但是万一在这两个操作之间突然出现了错误,比如银行系统突然断电,或突然宕机崩溃,都可能会导致小花的余额-1000之后,小白的余额却没有+1000,这样小花和小白就都不开心了。事务就是为了保证这两个关键操作要么都成功,要么都要失败的一个机制,都成功也就完成了转账,都失败也不会造成小花的损失。
星哥玩云
2022/08/18
5350
MySQL中的事务和事务隔离级别
一个事务是一个完整的业务逻辑单元,不可再分。 比如:银行账户转账,从A账户向B账户转账10000.需要执行两条update语句。
共饮一杯无
2022/11/28
7830
mysql的innodb引擎默认事务隔离级别_mysql中事务的隔离级别
这里不再重复READ_UNCOMMITTED, READ_COMMITTED, REAPEATED_READ, SERIALIZABLE这几种标准事务隔离级别的关系,网上资料一大把。很多朋友可能会有疑惑,如果Spring事务可以设置隔离级别,而数据库也可以设置默认隔离级别,那他们到底是怎样的关系呢?
全栈程序员站长
2022/11/07
1.5K0
spring事务的默认隔离级别_事务隔离级别有哪些
事务的四个隔离级别想必大家都已经清楚,但是在学习Spring的时候,我们发现Spring自己也有四个隔离级别(加上默认的是五个)。
全栈程序员站长
2022/11/04
1.2K0
spring事务的默认隔离级别_事务隔离级别有哪些
事务隔离级别总结
事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要么全部失
张申傲
2020/09/03
6880
事务的隔离级别
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。可以通过 SELECT @@tx_isolation; 命令来查看:
happyJared
2019/08/12
5940
mysql事务隔离级别
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
CodingCode
2021/09/23
1.4K0
mysql事务隔离级别
MySQL事务隔离级别
读未提交是一个事务仅修改了数据但还未提交时,本次修改可以便可被其他事务查询到变更后的值。读未提交隔离级别下,其他事务进行查询时,直接返回记录上的最新值,没有视图概念。
关忆北.
2022/11/16
1.4K0
MySQL事务隔离级别
MySQL事务隔离级别
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
Java技术债务
2022/08/09
1.1K0
Spring事务隔离级别
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。
一觉睡到小时候
2020/07/13
4770
MySQL事务隔离级别
索引是MySQL的数据结构,关系着MySQL如何存储数据,查询数据;而如何操作数据,解决多线程时操作数据带来的问题,则需要通过事务来完成。
阿珍
2023/05/17
4260
mysql事务隔离级别
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
Java帮帮
2019/06/15
1.6K0
Mysql事务隔离级别
在所有事物中可以看到事物没有提交的结果,实际应用中是很少的,他的性能也不比其他隔离级别好很多,读到未提交的结果导致脏读
小土豆Yuki
2020/08/28
1.5K0
mysql 事务隔离级别
1. MySQL事务隔离级别, 默认是可重复读(repeatable-read)
北漂的我
2020/12/02
1.1K0
MySQL 事务隔离级别[通俗易懂]
通过如下 SQL 可以查看数据库实例默认的全局隔离级别和当前 session 的隔离级别:
全栈程序员站长
2022/11/04
2.5K0
MySQL事务隔离级别
这四种级别由上至下,隔离强度逐渐增强,性能逐渐变差。它们没有绝对的优劣,采取哪种应该根据系统需求决定。MySQL默认级别为:可重复读。
Libertyyyyy
2022/10/25
1.3K0

相似问题

事务,设置隔离级别

13

在函数中设置事务隔离级别

22

在torque中设置事务隔离级别

13

PetaPoco -设置事务隔离级别

36

在每个事务上设置隔离级别

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文