b****u 发帖数: 1130 | 1 是个面试题。问一个账号,两个线程,一个+50 dollar, 一个加100 dollar.
如何保证在数据库上的结果是正确的。
我理解是用CAS的概念去解决这个问题。但对方要我写相关的SQL 语句, 并且详细解释
low-level级的操作。(e.g. Update BankAccount set balance=150 where...)
这应该是一个常见的问题。我对数据库的transaction了解很少。想请教大家,最好给
一点相关链接。 |
g*****g 发帖数: 34805 | 2 update account set balance = balance + ? where account_id = ?
Transaction is guarded by write lock on the row. So 2 threads won't do it at
the same time.
【在 b****u 的大作中提到】 : 是个面试题。问一个账号,两个线程,一个+50 dollar, 一个加100 dollar. : 如何保证在数据库上的结果是正确的。 : 我理解是用CAS的概念去解决这个问题。但对方要我写相关的SQL 语句, 并且详细解释 : low-level级的操作。(e.g. Update BankAccount set balance=150 where...) : 这应该是一个常见的问题。我对数据库的transaction了解很少。想请教大家,最好给 : 一点相关链接。
|
p*****2 发帖数: 21240 | 3 SQL没有类似Mongo incr这样的东西吗? |
T*********g 发帖数: 496 | 4 他想问的是transaction isolation level。
假设同时有Transaction T1, T2试图读取并修改相同的row,ANSI定义了好像有四种,
1) read_uncommitted Trasaction T1修改但是没有commit的data会被同时进行的T2读
取,这个叫dirty_read
2) read_committed 只有在事务提交后,才会对另一个事务产生影响,并且在对表进行
修改时,会对表数据行加上行共享锁
3)repeatable_read T2始终读取的值在T2的范围内不会改变
4)serializable 完全串行
具体这上面四种隔离模式在不同的数据库里是不大一样的。我比较熟悉MYSQL,MYSQL的
2,4都可以保证你说的情况。
【在 b****u 的大作中提到】 : 是个面试题。问一个账号,两个线程,一个+50 dollar, 一个加100 dollar. : 如何保证在数据库上的结果是正确的。 : 我理解是用CAS的概念去解决这个问题。但对方要我写相关的SQL 语句, 并且详细解释 : low-level级的操作。(e.g. Update BankAccount set balance=150 where...) : 这应该是一个常见的问题。我对数据库的transaction了解很少。想请教大家,最好给 : 一点相关链接。
|