我读过关于4个隔离级别的文章:
隔离级别脏读不可重复读幻象读
允许读取未提交的
读取已提交–允许
可重复读取—-允许
可序列化—-
我想了解每个事务隔离在表上的锁
读取未提交-表上无锁
读取已提交-锁定已提交的数据
sql块上的可重复读取锁定(使用select查询选择)
SERIALIZABLE-锁定完整表(对其激发Select查询)
下面是事务隔离中可能出现的三种现象
脏读-无锁
不可重复读取-提交的数据上没有脏读取作为锁定
幻象读取-锁定sql块(使用select查询选择)
我想了解我们在哪里定义这些隔离级别:仅在jdbc/hibernate级别或在DB中定义
PS:我已经浏览了oracle中隔离级别的链接,但是它们看起来很笨拙,并且谈论特定于数据库的内容
我想了解每个事务隔离在表上的锁
例如,您有3个并发进程A、B和C。A启动事务、写入数据和提交/回滚(取决于结果)。B只执行SELECT语句来读取数据。C读取和更新数据。所有这些过程都在同一个表T上工作
- 读取未提交的-表上没有锁。您可以在表上写入数据的同时读取表中的数据。这意味着A写入数据(未提交),B可以读取此未提交数据并使用它(用于任何目的)。如果A执行回滚,B仍然读取并使用了数据。这是处理数据的最快但最不安全的方法,因为这可能会导致物理上不相关的表中出现数据漏洞(是的,在现实世界的应用程序中,两个表可以在逻辑上但在物理上不相关=\)
- 读取提交的-锁定提交的数据。您可以读取仅提交的数据。这意味着A写入数据,而B在A执行提交之前无法读取A保存的数据。这里的问题是C可以更新在B上读取和使用的数据,而B客户机不会有更新的数据
- 可重复读取-锁定SQL块(使用select查询选择)。这意味着B在某些条件下读取数据,即
WHERE aField>;10和aField<;20,A在字段值介于10和20之间的位置插入数据,然后B再次读取数据并得到不同的结果 - SERIALIZABLE-锁定完整表(在该表上触发Select查询)。这意味着,B读取数据,没有其他事务可以修改表上的数据。这是处理数据最安全但速度最慢的方法。此外,由于一个简单的读取操作会锁定表,这可能会导致生产上的严重问题:假设T表是一个发票表,用户X想知道当天的发票,用户Y想创建一个新发票,因此当X执行发票读取时,Y不能添加新发票(当涉及到钱时,人们会非常生气,尤其是老板)
我想了解我们在哪里定义这些隔离级别:仅在JDBC/hibernate级别或在DB中定义
使用JDBC,您可以使用连接#setTransactionIsolation定义它
使用Hibernate:
<;property name=“hibernate.connection.isolation”>;2<;/property>;
在哪里
- 1:读取未提交
- 2:读取已提交
- 4:可重复读取
- 8:可序列化
Hibernate配置取自此处(对不起,是西班牙语)
顺便说一下,您还可以在RDBMS上设置隔离级别:
- MySQL隔离级别
- SQL Server隔离级别
- Informix隔离级别(个人注意:我永远不会忘记
将隔离设置为脏读语句。)
而且不停地