事务通常是指数据库事务,是指做为一个程序执行单元执行的一系列操做,要么彻底执行,要么彻底不执行。事务就是判断以结果为导向的标准。mysql
(1).原子性(atomicity)
原子性就是一个不可分割的工做单元。简单的说,就是指事务包含的全部操做要么所有成功,要么所有失败回滚。所以事务的操做若是成功就必需要彻底应用到数据库,若是失败则不能对数据库有任何影响。
(2).一致性(consistency)
一致性就是事务必须是使一个一致性状态变成另外一个状态,也就是说一个书屋执行以前和执行以后都必须处于一致性状态。那转帐来讲,假设用户A和用户B二者的钱加起来一共是5000.那么无论A和B之间如何转帐,转多少次,事务结束后二者的钱加起来仍是5000。
(3).隔离性(isolation)
隔离性就是一个事务的执行不能被另外一个事务干扰。当多个用户并发访问数据库操做同一张表时,数据库为每个用户开启的事务,不能被其余事务的操做所干扰,并发事务之间要相互隔离。
(4).持久性(durability)
持久性是指一个事务一旦被提交了,那么对数据库数据的改变就是永久的。即便是在数据系统遇到故障的状况下也不会丢失提交事务的操做。spring
* 脏读:一个事务读到了另外一个事务未提交的数据
* 不可重复读:一个事务读到另外一个事务已经提交(update)的数据致使屡次查询结果不一致
* 虚幻读:一个事务读到了另外一个事务已经提交(insert)的数据致使屡次查询结果不一致。
对于sqlserver和oracle的默认隔离级别是RC,mysql的默认隔离级别是RR。sql
对于spring的代码我有写过一个测试的小demo,在demo里面有记录如何添加的事务,同时也打印了日志记录最后结果,能够任意扩展。数据库
因为博客园上传代码比较麻烦,我就上传到CSDN上的,想测试的能够去下载。并发
网址:https://download.csdn.net/download/zj520_/12064006;mvc
1. 出现Exception是没法回滚的,只有抛出RuntimeException和Error异常时才能回滚。 2. 在事务代码中捕获了异常,是没法进行回滚的。
3. 若是是使用的spring+mvc模式。而且spring和mvc都扫描了service层(事务处理层),事务不生效。由于spring会有限加载mvc的配置文件,而事务的配置基本上都是在spring中,由于spring的子容器先于父容器启动,形成在controller中注入service时尚未加载事务。
4. mysql的myISAM引擎,是不支持事务的,须要设置为innoDB模式。
5. 事务的开启必须放到listener里面加载,若是放到dispatchServlet的配置里面,事务不生效。
6. 若是在接口中使用@Transactional,只有JDK动态代理才能生效,CGLIB动态代理是不生效的,由于注解是不能继承的。oracle
方法1:@Transactional注解指定rollbackFor=Exception.classsqlserver
方法2:让throw的自定义Exception继承RuntimeException测试
方法3:使用自定义注解,处理回滚Exception的问题:atom
@Transactional(rollbackFor=Exception.class)
public @interface DolTransactional {
}