T2的Blog观后感(1) 一个经常被忽略的关于更新异常的问题

本文探讨了通过增加时间戳字段来防止并发更新时的读脏数据问题。当两个用户同时编辑同一条记录时,后提交的更新会检查时间戳以确保数据一致性。

原文地址:

一个经常被忽略的关于更新异常的问题

http://www.cnblogs.com/leoo2sk/archive/2008/04/04/1137776.html

 

这是一篇讨论如何避免读脏数据的文章...

觉得作者提到的方法和那个md5的方法还有时间戳属一类方法...个人认为时间戳的最合适...

人怎么才能永恒提到的那种方法是手动实现了锁的功能...相对来说有些过多操作数据库了...

 

我来想想这个时间戳(timestamp)的实现...

数据库增加时间戳字段,读取信息后....把该时间戳字段保存起来...然后在UPDATE的时候和数据库中的比较...

如果和数据库中的一致...则UPDATE...同时也将timestamp字段修改...

如果此时有两个人Tom和Jerry Tom首先打开一条留言开始了编辑工作...Jerry在他之后也打开了同一条留言编辑...

然后UPDATE...然后Tom也UPDATE...但是Tom的UPDATE就会失败...时间戳已经被Jerry该掉了...

 

再具体的就等以后用到的时候再来尝试吧...

### 多线程环境下 `std::thread` 的运行结果分析 在多线程环境中,当多个线程操作共享资源时,必须考虑线程安全问题。如果共享资源未受到保护,可能会导致数据竞争和不确定的结果。以下是关于 `std::thread` 在多线程场景下的详细分析。 #### 共享计数器的增量操作 假设存在一个共享变量 `sharedCounter`,并且两个线程 `t1` 和 `t2` 都调用相同的函数 `incrementCounter` 来对该变量进行递增操作。如果未对共享变量进行保护,则可能会出现数据竞争问题,最终结果可能小于预期值[^1]。 以下是一个使用 `std::mutex` 保护共享资源的示例: ```cpp #include <iostream> #include <thread> #include <mutex> std::mutex mtx; // 定义一个互斥量 int sharedCounter = 0; // 共享资源 void incrementCounter() { for (int i = 0; i < 1000; ++i) { mtx.lock(); // 锁定互斥量 ++sharedCounter; // 访问共享资源 mtx.unlock(); // 释放互斥量 } } int main() { std::thread t1(incrementCounter); std::thread t2(incrementCounter); t1.join(); // 等待线程 t1 完成 t2.join(); // 等待线程 t2 完成 std::cout << "Final counter value: " << sharedCounter << std::endl; // 输出 2000 return 0; } ``` 在这个例子中,`std::mutex` 被用来确保同一时间只有一个线程可以访问和修改 `sharedCounter`,从而避免了数据竞争问题[^1]。 #### 使用 `std::atomic` 保护共享资源 另一种方法是使用 `std::atomic` 来保护共享资源。`std::atomic` 提供了轻量级的原子操作,适用于简单的计数器场景。以下是一个使用 `std::atomic` 的示例: ```cpp #include <iostream> #include <thread> #include <atomic> std::atomic<int> sharedCounter(0); // 原子变量 void incrementCounter() { for (int i = 0; i < 1000; ++i) { sharedCounter.fetch_add(1, std::memory_order_relaxed); // 原子性增加计数器值 } } int main() { std::thread t1(incrementCounter); std::thread t2(incrementCounter); t1.join(); // 等待线程 t1 完成 t2.join(); // 等待线程 t2 完成 std::cout << "Final counter value: " << sharedCounter.load() << std::endl; // 输出 2000 return 0; } ``` 在这个例子中,`std::atomic` 确保了对 `sharedCounter` 的操作是原子性的,因此即使有多个线程同时执行 `incrementCounter`,也不会发生数据竞争问题[^2]。 #### 并发环境下的结果预测 在并发环境下,线程 `t1` 和 `t2` 的执行顺序是不可预测的。然而,通过使用 `std::mutex` 或 `std::atomic`,可以确保最终的 `sharedCounter` 值为 2000。如果没有采取任何同步措施,`sharedCounter` 的最终值可能会小于 2000,具体取决于线程调度和指令重排序的影响[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值