全局变量 gMySQLClient=new MySQLClient(127.0.0.1:3306),gRedisClient =new RedisClient(127.0.0.1:6379);
场景 1-MySQL:
线程 A:
resA=gMySQLClient.Exec("Select * From A WHERE id=1").GetExecResult();
线程 B:
resB=gMySQLClient.Exec("Select * From B WHERE id=1").GetExecResult();
该场景有没可能发生 resA 是线程 B 返回的结果?假设线程 B 的结果比线程 A 先返回
场景 2-MySQL:
线程 A:
resA1=gMySQLClient.Exec("BEGIN").GetExecResult();
resA2=gMySQLClient.Exec("Update A SET a='a1' WHERE id=1").GetExecResult();
sleep(5*Time.Second);//t1 时刻,resA2 执行成功,resA3 暂未执行
resA3=gMySQLClient.Exec("Update B SET b='b1' WHERE id=1").GetExecResult();
resA4=gMySQLClient.Exec("COMMIT").GetExecResult();
线程 B:
resB1=gMySQLClient.Exec("BEGIN").GetExecResult();
resB2=gMySQLClient.Exec("Update C SET c='c1' WHERE id=1").GetExecResult()
resA3=gMySQLClient.Exec("COMMIT").GetExecResult();
该场景有没可能发生线程 B 执行的 COMMIT 恰好在 t1 时刻执行,然后把线程 A 提前 COMMIT 生效了?
场景 3-Redis:
线程 A:
resA=gRedisClient.Get("keyA")
线程 B:
resB=gRedisClient.Get("keyB")
该场景有没可能发生 resA 是线程 B 返回的结果?假设线程 B 的结果比线程 A 先返回
不太清楚它们底层的处理方式,恳请大佬解答,谢谢~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.