并发的问题

请教一个问题,jfinal两个程序都会更新mysql表里的同一条记录,为了避免并发问题,是不是要把数据库设置成innodb,并且在更新之前,select的使用使用 for update实现行锁定?有什么好的建议,谢谢

评论区

JFinal

2016-12-14 14:37

开启事务即可

JFinal

2016-12-14 14:37

事务的具体用法,jfinal 手册上有,在首页下载 jfinal 手册

ploolp

2016-12-14 15:09

一个程序开启事务可以,现在是两个独立的程序,事务应该控制不住,目前想到的办法是把查询和更新放到一个sql里,如果分成两条sql,则会存在并发的问题。

JFinal

2016-12-14 15:10

@ploolp 即便是 100 个独立的程序,但数据库是同一个实例,事务是针对当前的数据库实例来说的,事务就是来保障多线程或多项目实例同时操作同一个数据库时数据一致性的

ploolp

2016-12-14 15:19

谢谢回答,还有点疑惑,一个程序或一个线程一旦开启了事务后,别的程序和线程就无法操作数据库了?http://www.cnblogs.com/developer-ios/p/5357593.html,这个文章里说到的:“例如由于高并发,当前有三个用户a、b、c三个用户进入到了这个事务中,这个时候会产生一个共享锁,所以在select的时候,这三个用户查到的库存数量都是4个,同时还要注意,mysql innodb查到的结果是有版本控制的,再其他用户更新没有commit之前(也就是没有产生新版本之前),当前用户查到的结果依然是就版本”,这种情况不存在?

JFinal

2016-12-14 15:50

@ploolp 事务的控制策略是一个复杂问题,不同数据库有自己的一套算法,建议看看相关文档,jfinal 站在 web mvc + orm 这个层面,只管去使用数据库的事务,并不关心数据库底层如何利用事务控制保障数据的一致性

Romeo

2016-12-15 09:51

@JFinal jfinal自带的事务功能 和 乐观锁 两者的关系是怎样的?Jfinal的事务能代替乐观锁吗?

JFinal

2016-12-15 10:16

@Romeo jfinal 只是简单的开启 jdbc 的事务功能,并没有关注过乐观锁这些东东

热门反馈

扫码入社