我试图理解事务是如何工作的,我遇到了一个对我来说没有多大意义的场景。我希望有人能帮我理解它。
我有两笔交易
事务1
BEGIN; update data set val = val + 1 where id = 1
事务2
BEGIN; select * from data
我打开了两个终端,开始第一个事务并运行更新查询。这假定为id为1的元组上的事务1提供了独占锁。
然后,在提交第一个事务之前,我在另一个终端中运行第二个查询。我预计它会停止,因为第一个事务具有排它锁,这将阻止该事务获取id为1的元组上的读锁。
但是,mysql运行select查询并返回“非脏”数据。
有人能给我解释一下my
我在这里有一个来自MySQL 5.5.20 (基于行的)的二进制日志转储。现在我的奴隶停止了,因为UPDATE事件在INSERT事件之前:
5424240-SET TIMESTAMP=1327402568/*!*/;
5424241-BEGIN
5424242-/*!*/;
5424243-# at 25715325
5424244-# at 25715417
5424245:#120124 11:56:08 server id 1 end_log_pos 25715417 Table_map: `auto`.`data_export` mapped to number 91425
我目前正在使用Python3.8中的unittest为新创建的MySQL数据库编写一个测试用例。数据库是一个运行Aurora MySQL 5.6的AWS实例--它有一个表users,其中包含一个主键字段uuid VARCHAR(36)。测试用例如下:
import unittest
import mysql.connector
from config import MYSQL_CONNECTION_INFO
class SQLSchemaTests(unittest.TestCase):
"""Verifies the correct behavior of
在Read提交的隔离级别中,由于UPDATE语句将标记行脏,而且SELECT不应该能够在事务提交或回滚之前读取行,所以我希望下面是死锁。但它似乎没有陷入僵局。这是怎么发生的?
BEGIN TRAN
UPDATE TableA
SET Col2 = Col2 + 3
WHERE ID = 50
SELECT Col2 from TableA WHERE ID = 50
COMMIT TRAN
在我的服务类(它被注释为事务处理)中,我更新对象并将其保存为:
myObj.save(flush:true) //(Thread A, updates the value, Step A)
在此之后,对数据进行处理需要很长时间。在此过程中,域类中进行了大量更改,但这些更改在这里并不相关。因为所有这些处理都发生在同一个服务类中,所以它是单个事务的一部分。
同时,当所有这些处理进行时,另一个线程(它是另一个hibernate会话的一部分)访问
MyObj.findAll() //Thread B,在结果集中,我看到了更新的值。在Step A中更新的值,但是线程A尚未完成,因此更改尚未提交给数据