NutzCN Logo
问答 关于事务的一点小问题。
发布于 2338天前 作者 Mr.Hu 2036 次浏览 复制 上一个帖子 下一个帖子
标签:

这个事务中有两个insert,我想要的结果是第二个循环中的insert中报错时,第一个insert可以回滚。但是第二个insert倒是报错了,第一个还是正常插入。

@Aop(TransAop.READ_COMMITTED)
	public void insertR (RF_RemindEvent t){
		
    	this.dao().insert(t);
    	List<Sys_user> users = dao().query(Sys_user.class, null);	 
    	for(Sys_user user : users){
    		Z_RemindEvent_User z = new Z_RemindEvent_User();
    		z.setRid(t.getId());
    		z.setUid(user.getId());
    		z.setState(-1);
    		dao().insert(z);	 
    	}
    }
16 回复

mysql吗?表引擎是myisam?

查了百度是这样解释的。
出现这种是因为数据库把每个insert语句都看成是单独的事务,所以错误行以前的是不回滚的。

你还是查谷歌吧。。。

insert当独立事务?没听说过的

哦哦,看来要学习的东西还很多,我刚才查了一下表的引擎是InnoDB。
跟表的引擎有关是吗?那我看看不同引擎之间有啥区别。

对了,查表引擎直接在数据库中查的,用的语句是
show table status from spmswhere name='rf_remindevent';

Z_RemindEvent_User对应的表也是innodb吗?

是的,也是innodb。

报错信息贴一下看看

我自己故意把state设了datetime的格式,insert一个-1。就是为了测试事务的问题。

加一句,贴日志看看

Trans.DEBUG=true;

[DEBUG] 2017-12-07 11:09:17,455 org.nutz.trans.Trans._rollback(Trans.java:107) - Transaction rollback id=1, count=0

额,已经执行回滚了的, 会不会看错数据库了?

不能看错,就一个spms,确实已经插入了,没办法截图给你看。

#mysql
db.url=jdbc:mysql://127.0.0.1:3306/spms?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
db.username=root
db.password=root
db.validationQuery=select 1
db.maxActive=100
db.testWhileIdle=true
db.filters=mergeStat
db.connectionProperties=druid.stat.slowSqlMillis=2000
db.defaultAutoCommit=true

改成db.defaultAutoCommit=false试试

添加回复
请先登陆
回到顶部