怎么正确使用事务?

这个问题一直都没搞清楚

1.比方说我要执行一条sql:update A set name='abc' where id=111 这条sql要不成功要不失败,既然失败了也用不着回滚呀(数据库根本没发生变化呀?),这样也要去加个事务,why?
2.比如说一些查询语句select * from A 这样的为什么在spring里要去配个只读的事务,真是搞不清楚啊,是spring的问题,还是另有意图?

非常感谢大家能帮我解答一下!

1.假如你在更新数据库的时候,在执行更新的时候还伴随着其他的数据更新,电脑突然断电,而这个时候更新数据的操作正在进行着,数据更新了一半怎么办?这个时候就要用到事务中的回滚,恢复到失败以前的状态。
2.关于只读问题,引用《Spring in Action》里的解释,如果一个事务只对后端数据库执行读操作,数据库就可能利用事务只读特性,使用某些优化措施。通过声明一个事务为只读,你就给了后端数据库一个机会,来应用那些它认为合适的优化措施。
因为只读的优化措施是在事务启动时由后端数据库实施的,所以,只有将那些具有可能启动新事务的传播行为的方法的事务标记成只读才有意义。另外,如果你使用了Hibernate,那么一个只读事务将使Hibernate的flush模式设置为FLUSH_NEVER,告诉Hibernate避免和数据库进行不必要的对象同步,将所有更新延迟到事务的结束。

希望对楼主有帮助

1.事务主要针对的是多个SQL操作,事务保证要么这些SQL全部执行。如果有某个SQL执行出现错误,就回滚掉。这样就保证了业务的完整性。所以,要把事务配置到业务方法上,而不是将事务配置到单个DAO方法上。因为业务方法可能会执行多个DAO方法,所以要保证要么全部执行,要么全部不执行。
2.事务配置成只读,spring对某些数据库可能会优化只读事务的查询效率。