求问,事务的问题

whyyouhitme_ 2018-08-14 01:04:08

根据视频的讲解,在引入事务的时候,先关闭默认的提交开关。最后再手动调取commit()提交。但是视频又举一例,不写事务,看看会怎么样,结果如预料一样,int a= 10/0异常之前的代码执行了,其后面的代码并未执行。我的问题是,视频里说的事务是默认自动提交的。那么这种默认状态怎么用呢,我的意思是说,用事务,就如例1一样写,不用事务,就干脆什么都不写,两个例子均未见到“默认事务提交开关”的用法。
...全文
529 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
whyyouhitme_ 2018-08-15
  • 打赏
  • 举报
回复
引用 15 楼 maradona1984 的回复:
[quote=引用 14 楼 whyyouhitme_ 的回复:]那这个回滚是什么时候触发呢?触发的后果是?

触发?回滚自己调用方法rollback啊...当然自动提交就没回滚这一说了,成功了就提交,没成功就没成功
手动提交才有回滚一说[/quote]啊哦。明白了
nayi_224 2018-08-15
  • 打赏
  • 举报
回复
引用 10 楼 whyyouhitme_ 的回复:
[quote=引用 8 楼 nayi_224 的回复:]
关闭默认的提交开关,实际执行的代码是这样的

update account set money = money - 100 where id = 1;
update account set money = money - 100 where id = 2;
commit;


打开默认提交时这样的
update account set money = money - 100 where id = 1;
commit;

--出现异常,后面代码不执行

update account set money = money - 100 where id = 2;
commit;
出现异常不应该回滚至最初状态吗?现在结果是异常前的执行了,异常后的没执行。正确结果应该是异常前后代码都没执行才对吧?[/quote]

java本身并没有处理事务的能力。jdbc只不过是将代码委托给数据库进行执行而已。所有的事务,回滚都是数据库自身的机制处理的。至于你问的问题,我觉得你应该先去学一学数据库的基本常识。
verejava 2018-08-15
  • 打赏
  • 举报
回复
maradona1984 2018-08-15
  • 打赏
  • 举报
回复
引用 14 楼 whyyouhitme_ 的回复:
那这个回滚是什么时候触发呢?触发的后果是?

触发?回滚自己调用方法rollback啊...当然自动提交就没回滚这一说了,成功了就提交,没成功就没成功
手动提交才有回滚一说
whyyouhitme_ 2018-08-15
  • 打赏
  • 举报
回复
引用 7 楼 hzw2312 的回复:
通过连接对象conn来设置的事务~事务会对当前连接有效!
明白了,但能否劳烦正面回答一下例 2的疑问

引用 8 楼 nayi_224 的回复:
关闭默认的提交开关,实际执行的代码是这样的

update account set money = money - 100 where id = 1;
update account set money = money - 100 where id = 2;
commit;


打开默认提交时这样的
update account set money = money - 100 where id = 1;
commit;

--出现异常,后面代码不执行

update account set money = money - 100 where id = 2;
commit;
我可不可以认为这个结果不符合事务的异常回滚?

引用 13 楼 maradona1984 的回复:
[quote=引用 11 楼 whyyouhitme_ 的回复:]
[quote=引用 10 楼 whyyouhitme_ 的回复:]
[quote=引用 8 楼 nayi_224 的回复:]
关闭默认的提交开关,实际执行的代码是这样的

update account set money = money - 100 where id = 1;
update account set money = money - 100 where id = 2;
commit;


打开默认提交时这样的
update account set money = money - 100 where id = 1;
commit;

--出现异常,后面代码不执行

update account set money = money - 100 where id = 2;
commit;
出现异常不应该回滚至最初状态吗?现在结果是异常前的执行了,异常后的没执行。正确结果应该是异常前后代码都没执行才对吧?[/quote]你银行存取款。取了钱想存进另一个账户,刚取出来停电了,结果第一个账户扣了钱,存不到第二个上,这钱凭空不见了[/quote]
你举取钱的例子的目的是什么?
我猜测你对事务理解出了误差,你举的例子是业务层面的,需要程序员编写合理的代码来保证数据一致性,需要把多个数据库操作纳入同一个事务里,但自动提交就是每执行一条sql事务就提交一次,跟你举的例子毫无关系[/quote]

引用 13 楼 maradona1984 的回复:
[quote=引用 11 楼 whyyouhitme_ 的回复:]
[quote=引用 10 楼 whyyouhitme_ 的回复:]
[quote=引用 8 楼 nayi_224 的回复:]
关闭默认的提交开关,实际执行的代码是这样的

update account set money = money - 100 where id = 1;
update account set money = money - 100 where id = 2;
commit;


打开默认提交时这样的
update account set money = money - 100 where id = 1;
commit;

--出现异常,后面代码不执行

update account set money = money - 100 where id = 2;
commit;
出现异常不应该回滚至最初状态吗?现在结果是异常前的执行了,异常后的没执行。正确结果应该是异常前后代码都没执行才对吧?[/quote]你银行存取款。取了钱想存进另一个账户,刚取出来停电了,结果第一个账户扣了钱,存不到第二个上,这钱凭空不见了[/quote]
你举取钱的例子的目的是什么?
我猜测你对事务理解出了误差,你举的例子是业务层面的,需要程序员编写合理的代码来保证数据一致性,需要把多个数据库操作纳入同一个事务里,但自动提交就是每执行一条sql事务就提交一次,跟你举的例子毫无关系[/quote]那这个回滚是什么时候触发呢?触发的后果是?
maradona1984 2018-08-15
  • 打赏
  • 举报
回复
引用 11 楼 whyyouhitme_ 的回复:
[quote=引用 10 楼 whyyouhitme_ 的回复:]
[quote=引用 8 楼 nayi_224 的回复:]
关闭默认的提交开关,实际执行的代码是这样的

update account set money = money - 100 where id = 1;
update account set money = money - 100 where id = 2;
commit;


打开默认提交时这样的
update account set money = money - 100 where id = 1;
commit;

--出现异常,后面代码不执行

update account set money = money - 100 where id = 2;
commit;
出现异常不应该回滚至最初状态吗?现在结果是异常前的执行了,异常后的没执行。正确结果应该是异常前后代码都没执行才对吧?[/quote]你银行存取款。取了钱想存进另一个账户,刚取出来停电了,结果第一个账户扣了钱,存不到第二个上,这钱凭空不见了[/quote]
你举取钱的例子的目的是什么?
我猜测你对事务理解出了误差,你举的例子是业务层面的,需要程序员编写合理的代码来保证数据一致性,需要把多个数据库操作纳入同一个事务里,但自动提交就是每执行一条sql事务就提交一次,跟你举的例子毫无关系
whyyouhitme_ 2018-08-15
  • 打赏
  • 举报
回复
引用 9 楼 zzxiaoma 的回复:
这么说吧,insert update delete这些就是一个事务

麻烦正面回答一下这个。一楼提出的例2:出现异常不应该回滚至最初状态吗?现在结果是异常前的执行了,异常后的没执行。正确结果应该是异常前后代码都没执行才对吧?你银行存取款。取了钱想存进另一个账户,刚取出来停电了,结果第一个账户扣了钱,存不到第二个上,这钱凭空不见了
whyyouhitme_ 2018-08-15
  • 打赏
  • 举报
回复
引用 10 楼 whyyouhitme_ 的回复:
[quote=引用 8 楼 nayi_224 的回复:]
关闭默认的提交开关,实际执行的代码是这样的

update account set money = money - 100 where id = 1;
update account set money = money - 100 where id = 2;
commit;


打开默认提交时这样的
update account set money = money - 100 where id = 1;
commit;

--出现异常,后面代码不执行

update account set money = money - 100 where id = 2;
commit;
出现异常不应该回滚至最初状态吗?现在结果是异常前的执行了,异常后的没执行。正确结果应该是异常前后代码都没执行才对吧?[/quote]你银行存取款。取了钱想存进另一个账户,刚取出来停电了,结果第一个账户扣了钱,存不到第二个上,这钱凭空不见了
whyyouhitme_ 2018-08-15
  • 打赏
  • 举报
回复
引用 8 楼 nayi_224 的回复:
关闭默认的提交开关,实际执行的代码是这样的

update account set money = money - 100 where id = 1;
update account set money = money - 100 where id = 2;
commit;


打开默认提交时这样的
update account set money = money - 100 where id = 1;
commit;

--出现异常,后面代码不执行

update account set money = money - 100 where id = 2;
commit;
出现异常不应该回滚至最初状态吗?现在结果是异常前的执行了,异常后的没执行。正确结果应该是异常前后代码都没执行才对吧?
fish-man 2018-08-15
  • 打赏
  • 举报
回复
@huhaiman
夜空中的小轩 2018-08-15
  • 打赏
  • 举报
回复
使用三层就行了
zzxiaoma 2018-08-14
  • 打赏
  • 举报
回复
这么说吧,insert update delete这些就是一个事务
nayi_224 2018-08-14
  • 打赏
  • 举报
回复
关闭默认的提交开关,实际执行的代码是这样的

update account set money = money - 100 where id = 1;
update account set money = money - 100 where id = 2;
commit;


打开默认提交时这样的
update account set money = money - 100 where id = 1;
commit;

--出现异常,后面代码不执行

update account set money = money - 100 where id = 2;
commit;
BUG胡汉三 2018-08-14
  • 打赏
  • 举报
回复
通过连接对象conn来设置的事务~事务会对当前连接有效!
whyyouhitme_ 2018-08-14
  • 打赏
  • 举报
回复
引用 4 楼 nayi_224 的回复:
你获取了一条数据库的链接,所有的语句都在这里面写的。这难道不叫“相关的语句”?

如果例 2引入了事务,那应该在除零异常的时候回滚,然而结果显示并没有回滚。而是执行了异常语句之前的代码
whyyouhitme_ 2018-08-14
  • 打赏
  • 举报
回复
引用 4 楼 nayi_224 的回复:
你获取了一条数据库的链接,所有的语句都在这里面写的。这难道不叫“相关的语句”?

所以有连接对象就算是有相关语句了吗?那怎么解释例2?例2明显没有引入事务啊?
nayi_224 2018-08-14
  • 打赏
  • 举报
回复
你获取了一条数据库的链接,所有的语句都在这里面写的。这难道不叫“相关的语句”?
whyyouhitme_ 2018-08-14
  • 打赏
  • 举报
回复
引用 1 楼 zzxiaoma 的回复:
默认就是执行后就提交了,不能回退,自己控制的话可以在某个地方自己控制是回退还是提交

什么相关的代码都没有,怎么知道这是一个事务呢?就像例子2一样,你说它是默认提交呢?还是没有事务呢?从运行结果来看它不是事务,因为如果是事务的话,出异常会rollback,显然它并没有回滚,因为结果显示扣钱的代码执行了,加钱的并未执行。
whyyouhitme_ 2018-08-14
  • 打赏
  • 举报
回复
引用 1 楼 zzxiaoma 的回复:
默认就是执行后就提交了,不能回退,自己控制的话可以在某个地方自己控制是回退还是提交

我的意思是,怎么体现这是一个事务呢?没有相关的语句,我可以认为这就是个普通类
zzxiaoma 2018-08-14
  • 打赏
  • 举报
回复
默认就是执行后就提交了,不能回退,自己控制的话可以在某个地方自己控制是回退还是提交

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧