service级别的事务,是否在一个按钮点击开始,事务开始,直到这个方法结束,只提交一次事务给数据库。不管这个方法里面操作了多少次表,或者多少张表。
PS:我遇到的问题是,我有一个共通的各种单号自动生成工具类,现在两个不同的用户在同一秒中,做了相同的操作,导致取到了相同的单号。
项目:JFinal
service级别的事务,是否在一个按钮点击开始,事务开始,直到这个方法结束,只提交一次事务给数据库。不管这个方法里面操作了多少次表,或者多少张表。
PS:我遇到的问题是,我有一个共通的各种单号自动生成工具类,现在两个不同的用户在同一秒中,做了相同的操作,导致取到了相同的单号。
你碰到的问题,很可能是因为事务级别不够引起的,对于 mysql 来说 jfinal 比较高版本的事务级别是:
Connection.TRANSACTION_REPEATABLE_READ;
这个值是:4, 对于一般的应用是够用的
oracle 下面值是: 2
在使用事务的时候,有一件事情要特别注意,如果你是将数据库的值先读到内存,然后改这个值,再存到内存,那么事务级别是要相应提高的,例如:
int cash = Db.queryInt("select cash from account where id = ?", 123);
cash = cash + 100;
Db.update("update account set cash = ? where id = ?", cash, 123);
如果你的更新操作是用 sql 实现,直接在数据库中实现的,那么事务级别可以更低,例如:
Db.update("update account set cash = cash + 100 where id = ? ", 123);
注意区别上面两种用法,前面的用法对数据的操作是在你的应用中, 后面的用法是在 mysql 数据库中,这两种用法对事务级别的要求是不同的,前者起码要锁住 id 值为 123 的行,如果更新范围大需要锁表,这个锁行、锁表就是与事务级别有关的,事务级别越高,锁的范围就越大