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的事务级别配置的问题,还是代码的问题?
TRANSACTION_SERIALIZABLE###### 事务在哪打开的?没到看 @Before(Tx.class) ,也没看到 Db.tx(...),建议详细看一下 jfinal 手册有关事务的用法,在此下载: http://www.jfinal.com######
不行。。当我设置这个最高事务级别时
直接抛出异常:
com.jfinal.plugin.activerecord.ActiveRecordException: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
######多线程死锁了,但会保障事务安全版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。