1、事务首先是作用于数据库上的,可以是一条SQL语句,也可以是多条,甚至是整个程序。
事务就是对一系列的数据库操作进行统一的提交或回滚 。 在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。 Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。 Spring中也有自己的事务管理机制,使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。 |
2、事务并发问题:(前提是多个事务同时操作,而不是针对一个事务中来说的)
**脏读:一个事务读取到另一个事务的未提交数据。
**不可重复读:对同一记录的两次读取不一致,因为另一事务对该记录做了修改。
**幻读:对同一张表的两次查询不一致,因为另一事务插入了一条记录;
3、隔离级别:
** SERIALIZABLE(串行化)
不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
性能最差;
** REPEATABLE READ (可重复读)(MySQL)
防止脏读和不可重复读;
性能比SERIALIZABLE好
** READ COMMITTED (读已提交数据)(Oracle)
防止脏读;
性能比REPEATABLE READ好
** READ UNCOMMITTED (读未提交数据)
不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
性能最差;
** REPEATABLE READ (可重复读)(MySQL)
防止脏读和不可重复读;
性能比SERIALIZABLE好
** READ COMMITTED (读已提交数据)(Oracle)
防止脏读;
性能比REPEATABLE READ好
** READ UNCOMMITTED (读未提交数据)
4、如何理解不可重复读和可重复读:
不可重复读(变化):一个事务对同一记录的读取不一致,这是因为另一事务对该记录做了修改。
一个事务A一旦开启并读取数据,另
一 个事务
B对数据做了修改操作(已提
交),这
个事务A再次读取数据就是事务B修改后的数据。
可重复读(不变):是MySQL的默认隔离级别,它的意思是一个事务A一旦开启并读取数据,另一个事务B即使对数据做了修改操作
(已
提
交),这
个事务A再次读取数据跟之前是一样的,不会因为事务B对数据进行了修改而改变。
5、(自己的理解)
**对于事务就是把多条SQL语句放在一起,要么成功都执行,要么失败回滚(回滚到保存点不算是提交事务,但是回滚整
个过程 是提交事务)。
**即便不是手动添加事务,其实数据库会自动添加事务(MySQL每一条语句就是一个事务),且这个事务的read—only的默
认
是 false,所以可以进行增删改查。手工添加事务若不指定read-only,默认依旧是false。
**只读事务可以理解为:
概念:从这一点设置的时间点开始(时间点a)到这个事务结束的过程中,其他事务所提交的数据,该事务将看不见!
(查询中不会
出现别人在时间点a之后提交的数据)。
如果只是一条查询语句,那么不必手动开启事务,mysql默认支持SQL执行期间的读一致性。
若是多条查询语句,则需要开启
只读事务。例如统计查询,报表查询,在这种场景下,多条查询SQL必须保证整体的读一致性,
否
则,在前
条SQL查询之后,后条SQL查询之前,数据被
其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态。
**关于在SSH框架中的service层添加@transaction的事务注解的解释。
如果配置了OpenSessionInViewFilter,那么如果不在service层添加事务注解,这个过滤器检测不到这个注解,就会自动把默认
的事务 的read-only变为true(
Flush.NEVER)
,这个时候进行增删改操作就会报出
只读错误
。如果添加了注解,那么会自动的
将
read-only变为 自动,增删改为false,查询为true。(由Flush.NEVER变为Flush.AUTO)
若没有配置
OpenSessionInViewFilter
,那么这个时候即便不在service层添加事务注解,默认的事务read-only为false,则进
行增删改 不会报只读错误。
网上的解释:
** 只读事务并不是改变数据库为只读模式,而是本身不能含有增删改语句。
6、事务的特性:ACID
原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
一致性 (Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两
个账号余额之和应该是不变的。(最重要)
隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。--隔离级别
持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩
隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。--隔离级别
持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩
溃,在数据库重启时,也必须能保证通过某种机制恢复数据。