日期:2014-05-20  浏览次数:20695 次

关于事务的困惑,求高手解答!!!!!!!!!!!
在jdbc中,一个dml语句会默认开启事务,执行成功后提交。如果是两个dml语句,如果不设置自动提交为false的话,会在执行过程中开启两个事务把?
还有,在hibernate中是对jdbc的封装,如果还是两个dml语句,那么应该是如果不开启事务的话,也能执行,但是第二条语句会提示nosession的错误,这是为什么?数据库不会默认给开启事务吗?
还有,spring对事务的管理,如果在一个方法上不开启事务,那么能不能正常执行?如果是两条dml语句有是怎么样?是不是不加事务就会默认像jdbc一样,第一个dml开启一个事务,第二个又开启一个?
我有点乱,希望有高手给我解答下,先谢谢了!!!!!!!!!!!!!!!!!!!!!!

------解决方案--------------------
在jdbc中,一个dml语句会默认开启事务,执行成功后提交。这个,要设置自动提交为true的时候才会,如果为false,需要手动commit。

如果是两个dml语句,如果不设置自动提交为false的话,会在执行过程中开启两个事务把?这个,看你的程序是怎么写的,如果在一个线程里,提交第一个语句后,开启一个事务,执行成功,commit,然后再提交第二个语句,开启一个事务,执行成功,commit。如果是两个线程里,很可能是同时开两个事务。

在hibernate中是对jdbc的封装,如果还是两个dml语句,那么应该是如果不开启事务的话,也能执行,但是第二条语句会提示nosession的错误,这是为什么?数据库不会默认给开启事务吗?
你如果没有开启事务管理,hibernate会自动开启管理的,第二条报错,你得查查是什么原因......

spring对事务的管理,如果在一个方法上不开启事务,那么能不能正常执行?如果是两条dml语句有是怎么样?是不是不加事务就会默认像jdbc一样,第一个dml开启一个事务,第二个又开启一个?
spring 对事务的管理和hibernate一样的,只是实现方法不同.......


------解决方案--------------------
探讨
在jdbc中,一个dml语句会默认开启事务,执行成功后提交。这个,要设置自动提交为true的时候才会,如果为false,需要手动commit。

如果是两个dml语句,如果不设置自动提交为false的话,会在执行过程中开启两个事务把?这个,看你的程序是怎么写的,如果在一个线程里,提交第一个语句后,开启一个事务,执行成功,commit,然后再提交第二个语句,开启一个事务,执行成功,commit。……

------解决方案--------------------
回复5楼
事务和session是两个对象,当事务提交后session就关闭了。你描述的现象应该是在session关闭后仍然想使用这个session.解决办法:重新开session或者在一个事务中操作。
------解决方案--------------------
在hibernate中是对jdbc的封装,如果还是两个dml语句,那么应该是如果不开启事务的话,也能执行,但是第二条语句会提示nosession的错误,这是为什么?数据库不会默认给开启事务吗?
::在hiberante中的事物操作时有session对象完成的, 你说的nosession应该是你用session提交的, 而session提交完后会关闭。 你可以写一个过滤器, 在过滤器中将session对象绑定在线程。等所有事物都提交后在关闭。
spring对事务的管理,如果在一个方法上不开启事务,那么能不能正常执行?如果是两条dml语句有是怎么样?是不是不加事务就会默认像jdbc一样,第一个dml开启一个事务,第二个又开启一个?
::在spring中,你可以生成hibernatemplate, 生成事物管理器对象, 并运用AOP切面添加事物的开启和提交