Jfinal中设置了JDBC事务为TRANSACTION_REPEATABLE_READ,但是无效
我在JFinal2.2上测试并发程序:
思路是并发的读取数据库中的一个int字段然后对它进行加1操作
数据表:
CREATE TABLE `unsafe_test` ( `id` int(11) NOT NULL, `number` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
首先我设置了JDBC的事务级别
arp.setTransactionLevel(Connection.TRANSACTION_REPEATABLE_READ);
然后在controller中写一个方法
public void readAndWrite() { // 先读取一个值,再写入数据库 UnsafeTest t = UnsafeTest.dao.findById(1); System.out.println("id: " + Thread.currentThread().getId() + " number: " + t.getNumber()); t.setNumber(t.getNumber() + 1); t.update(); renderText("OK"); }结果打印的结果是:
id: 130 number: 1
id: 128 number: 1
id: 147 number: 1
id: 91 number: 1
id: 34 number: 1
id: 149 number: 1
id: 111 number: 1
id: 148 number: 1
id: 35 number: 1
id: 35 number: 2
出现了重复读取,请问向这种情况是JDBC的事务级别配置的问题,还是代码的问题?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
多线程死锁了,但会保障事务安全
引用来自“dy810810”的评论
TRANSACTION_SERIALIZABLE
直接使用 Db.update("update unsafe_test set number=number+1 where id=?", id);
引用来自“JFinal”的评论
事务在哪打开的?没到看 @Before(Tx.class) ,也没看到 Db.tx(...),建议详细看一下 jfinal 手册有关事务的用法,在此下载:
http://www.jfinal.com
事务在哪打开的?没到看 @Before(Tx.class) ,也没看到 Db.tx(...),建议详细看一下 jfinal 手册有关事务的用法,在此下载:
http://www.jfinal.com
TRANSACTION_SERIALIZABLE