比如考虑用户的注册的情况,先根据用户名判断数据库里有没有同用户名称的,如果没有的话创建用户。
请问各位,这种情形需不需要加数据库事务?并限定事务的级别。我考察了几个开源的代码发现都没有加数据库事务。下面是 reddit 的代码:
def register(name, password, registration_ip):
try:
a = Account._by_name(name)
raise AccountExists
except NotFound:
a = Account(name = name, password = bcrypt_password(password))
# new accounts keep the profanity filter settings until opting out
a.pref_no_profanity = True
a.registration_ip = registration_ip
a._commit()
return a
1
oott123 2015-10-29 13:17:07 +08:00 via Android 1
如果你的用户名有唯一索引,那就不用,反正插也插不进去。
|
2
domty 2015-10-29 13:30:19 +08:00
这样不用,我都是在进行 insert , updata , delete 总计超过两次以上,为了保证一致性才开事务的。
你这个查出来有重合就不执行插入了,要事务没啥意义。 |
3
taofuan OP @domty 是吗? 我是这么想的就像 2 个线程一样 线程 1 查询某用户名没有,线程 2 这时候插入了同用户名的用户,然后线程 1 开始插入, 所以我寻思开个事务保证一下
|
5
domty 2015-10-29 14:25:32 +08:00 1
@taofuan
没有任何关系,你把数据库当成一个整体看。第一次问他有没有和你手头的数据重合的数据,有就中止后面的插入操作了。如果你的数据库里执行插入的那张表有用户名唯一约束的话都不用查是否重合,直接插入等数据库的返回信息就行了。 你的这个过程应该是一个线程从头走到尾的,至于数据库内是如何执行的你的 sql 你不需要考虑。 |
6
moro 2015-10-29 14:32:01 +08:00 1
需要的
所有从数据库中取出数据进行判断来修改或者插入数据,都是需要保证数据一致性的。 |
7
moro 2015-10-29 14:32:43 +08:00
如果使用插入判断,就不需要的。
|