事务及回滚

事务

事务的ACID特性,即原子性、一致性、隔离性、持久性。

1、原子性:事务必须是原子工作单元,对其进行的数据修改,要么全部执行,要么全不执行。 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。比如,当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统在运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。

2一致性:事务在完成时,必须使所有的数据都保持一致状态,即所有的数据都要发生更改,以保证数据的完整性。

3隔离性:一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

4持久性:一旦事务被提交之后,数据库的变化中数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。


不需要显式使用事务语句开始一个事务,当遇到第一个DML语句时,一个事务开始,在出现以下情况时,事务结束。

(1)当遇到 commit 语句 或 rollback 语句时,将提交或回滚事务。

(2)当用户退出 Oracle工具时。

(3)当机器失效或系统奔溃时。

事务(Transaction)是并发控制单位,是用户定义的一个操作序列,事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。

事务中的所有操作要么全部执行,要么都不执行;是一个不可分割的工作单位。 如果事务没有原子性的保证,那么在发生系统 故障的情况下,数据库就有可能处于不一致状态。 因而,事务的原子性与一致性是密切相关的。

spring事务回滚

03-01

初学spring,然而调试了好久,都没能让其声明式事务发挥作用,无奈,求助!rnrnspring配置文件:rnrn[code=XML]rnrnrnrnrn rn com.mysql.jdbc.Driverrn jdbc:mysql://localhost:3306/ormrn rootrn rootrn rn rn rn rn rn rn com/itlover/hibernate/User.hbm.xmlrn com/itlover/hibernate/Card.hbm.xmlrn rn rn rn rn org.hibernate.dialect.MySQLDialectrn truern rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn PROPAGATION_REQUIRED,-Exceptionrn rn rn rn rn rn rn rn rnrn[/code]rnrn执行操作的是保存一个 User, User跟Card进行cascade级联,即保存User时也让Hibernate保存Cardrnrn,程序中故意把 card.setCardBankname("招商银行"); 给注释掉(此属性不能为空),就是希望在此处可以看到rnspring的事务是否生效...rnrnrn具体代码为:rnrn[code=Java]rnAction.javarnrnpublic ActionForward test(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exceptionrn rn User user = new User();rn user.setUserName("susan");rn user.setUserAge(21);rn rn Card card = new Card();rn // card.setCardBankname("招商银行");rn card.setCardNumber("6225888811558899");rn card.setUser(user);rn rn user.getCards().add(card);rn rn baseService.saveEntity(user);rn rn return null;rn rnrnrnService.javarnrnpublic class DefaultServiceImpl implements BaseServicernrn private BaseDao baseDao;rn public void saveEntity(Object entity)rn rn baseDao.saveEntity(entity);rn rn rn public void setBaseDao(BaseDao baseDao)rn rn this.baseDao = baseDao;rn rnrnrnrnDao.javarnrnpublic class DefaultDaoImpl extends HibernateDaoSupport implements BaseDaornrn public void saveEntity(Object entity)rn rn getHibernateTemplate().save(entity);rn rnrnrn[/code]rnrnrn执行的结果:是user对象被持久化了...rnrnrn正确的结果应该是因为card不能被持久化,而整个事务回滚,即user不应被持久化才是rnrnrnrn大家帮帮忙啊

spring事务不能回滚

11-20

[b]xml:[/b]rnrnrn rn rn rnrn rn rn classpath:jdbc.propertiesrn rn rnrn rn rn rn rn rn rnrnrn rn rn rn rn model.Userrn model.Logrn rn rn rn rn rn org.hibernate.dialect.MySQLDialectrn rn threadrnrn truern rn rn rnrnrn rn rn rnrn rn rn rn rn rn rn rn rn rn rnrnrnrnrn[b]userService.java[/b]rn@Componentrnpublic class UserService rn private LogDAO logDAO;rn private UserDAO userDAO;rnrn public void add(User u) rn this.userDAO.save(u);rn Log log = new Log();rn log.setMsg("a used saved!!");rn logDAO.save(log);rn rn rnrn public LogDAO getLogDAO() rn return logDAO;rn rnrn public UserDAO getUserDAO() rn return userDAO;rn rnrn @Resourcern public void setLogDAO(LogDAO logDAO) rn this.logDAO = logDAO;rn rnrn @Resourcern public void setUserDAO(UserDAO userDAO) rn this.userDAO = userDAO;rn rnrnrn[b]LogDAOImpl.java[/b]rn@Componentrnpublic class LogDAOImpl implements LogDAO rn private SessionFactory sessionFactory;rnrn public SessionFactory getSessionFactory() rn return sessionFactory;rn rn rn @Resourcern public void setSessionFactory(SessionFactory sessionFactory) rn this.sessionFactory = sessionFactory;rn rnrn public void save(Log log) rn rn Session s = sessionFactory.getCurrentSession();rn s.save(log);rn [b]throw new RuntimeException("error!");[/b] //这里明明抛出了运行时异常,但数据还是插进去了rnrnrnrnrnrn事务无法回滚,用注解的也一样,我是看的一个老师的视频敲的代码,我把老师的源码copy进去运行,也还是不行,不知是什么原因啊

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试