Jfinal中设置了JDBC事务为TRANSACTION_REPEATABLE_READ,但是无效

发布于 2021-12-03 01:52:20 字数 1302 浏览 795 评论 6

我在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

鹤舞 2021-12-04 17:17:59

多线程死锁了,但会保障事务安全

鹤舞 2021-12-04 17:05:18

引用来自“dy810810”的评论

TRANSACTION_SERIALIZABLE

背叛残局 2021-12-04 16:58:18

直接使用 Db.update("update unsafe_test set number=number+1 where id=?", id);

各自安好 2021-12-04 15:54:14

引用来自“JFinal”的评论

   事务在哪打开的?没到看 @Before(Tx.class) ,也没看到 Db.tx(...),建议详细看一下 jfinal 手册有关事务的用法,在此下载:
http://www.jfinal.com

归属感 2021-12-04 11:42:15

   事务在哪打开的?没到看 @Before(Tx.class) ,也没看到 Db.tx(...),建议详细看一下 jfinal 手册有关事务的用法,在此下载:
http://www.jfinal.com

裸钻 2021-12-03 05:25:01

TRANSACTION_SERIALIZABLE

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文