JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为啥没有虽然没有添加,但是ID自动增加

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为啥没有虽然没有添加,但是ID自动增加相关的知识,希望对你有一定的参考价值。

老师说的是:在数据库添加上面,特别是用在银行转账实例最好用事务提交,因为当这边添加语句(如转账)时遇到系统异常或是网络异常,就不会出现一个执行了,另外一边没有执行(转账的就是如果这边转账好,于到异常,但是这边又扣了,那么没有收到)。只有当两边同时正确执行才执行;一边执行,另外一边没有执行两边都不执行,自动回滚。

如下语句:我有两个插入语句,如果故意把其中一条输入错误,虽然两条都不能添加;单是我的数据表里面的id序列却自动增加了,下面的34.35.然后我错误的运行了两次,自动增加了ID主键的序列。如下图:

问题:我的id序列在数据库里面设置了自动增加和主键。怎么我下面的代码中,插入一条语句,使得我错误一条运行后,id'的序列号也不能增加!!这样才是真正的事务添加啊!!谢谢了

//通过事务提交添加属性值
private void TransactionAddGradeByName() throws Exception
Connection connection = ConnectionStart.getConnection();
System.out.println("事务添加方法数据驱动程序加载成功");
System.out.println("事务添加方法数据库连接成功!");
//关闭自动提交
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
statement.executeUpdate("insert into grade(name,score)"+"values('n9',100);");
statement.executeUpdate("insert into grade(name,score)"+"values('n10',110);");
// statement.executeBatch();//执行批量SQL语句
connection.commit();//手动提交
connection.setAutoCommit(false);
//关闭JDBC对象
ConnectionClose.close(statement,connection);
queryAll(); //

首先自增ID本来就被设计成为不参与数据库事务的,原因是什么呢?为了防止ID生成阻塞和防止ID错乱,因为对了一张表来说,不是只有你一个线程在申请ID,其他的新增线程了也在申请ID,假设你在事务中第一次申请到了ID=1,但这时你的事务并没提交,也就是这个等于1的ID现在并没有真正入库,想想这时别人的进程也去申请同一个表的ID时,ID生成器该给他1还是2?当然是2啦!如果你这时你回滚你的事务,假设事务把ID=1回滚了,给回ID生成器,ID生成器还能把它给出去别人用么?肯定不行啦,为啥,如果这时那个上次拿到2的线程这次又去拿,不是要拿到1了?说好的自增呢?!也许你会说可以等你下次申请ID时给你呀,把3给刚刚那个拿了2的呀,不好意思,数据库会话(SqlSession)一关,谁记得你呀! 参考技术A 此代码中, 没有回滚。。。。。。。追问

为什么没有回滚呀? 但是我其中一条插入语句错误,另外一条也没有执行,只是id编号自动增加了两个!不知道这算不算回滚呢?
~那如果想实现真正的回滚,连主键编号都不会增加该加入什么语句呢?

本回答被提问者采纳

以上是关于JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为啥没有虽然没有添加,但是ID自动增加的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-JDBC

java-JDBC

JAVA-jdbc连接数据库

java-JDBC操作数据库

JAVA-JDBC

Java-JDBC