mybatis事务
Connection setAutoCommit() 执行查询没有影响 执行增删改时
SqlSessionFactory openSession(boolean autoCommit) 默认值就是false 开启事务
SqlSession对象 commit(),如果在mybatis使用中向关闭事务,需设置autoCommit为true
什么是事务?
事务是由单独单元的一个或者多个sql语句组成的,在这个单元中,每个sql语句都是相互依赖的,而整个单独单元是一个不可分割的整体。如果单元中某条sql语句执行异常,那么整个这个单元则将会回滚。
事务的四大特性ACID
- 原子性:一个事务是不可分割的一个整体,在这个整体中要么全部执行,要么全部不执行。Atomicity
- 一致性:一个事务的执行会使数据从一个一致状态切换到另外一个一致状态。Consistency
- 隔离性:一个事务的执行不受其他事务的干扰 Isolation
- 持久性:一个事务一旦提交,则会永久的改变数据库的数据,数据不可逆 Durability
由事务的隔离性会引发的问题:
- 脏读
脏读是指一个事务处理过程中读取到了另外一个事务尚未提交的事务中的数据。
- 不可重复读
不可重复读是指对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是在查询的时间间隔内,被另外一个事务修改并提交了。
- 虚读(幻读)
幻读是指事务非独立运行时发生的一种现象,例如有两个事务A、B,这两个事务同时对用户表user做操作,事务A对用户表做了全局修改 把用户表中的所有人的性别改为男性。这时候同时另外一个事务B往用户表中插入了一条新数据 新数据中的性别为女性,并且这个数据进行提交到数据库。
这时候事务A如果再次查看用户表修改的数据,发现有一条数据的性别为女性。对于事务A来说就好像产生了 幻觉一样,这就是幻读。
- 不可重复读和幻读都是读取到了另外一个已经提交的事务数据(和脏读现象不一样)
解决办法:通过提高数据库的隔离性来解决以上问题
隔离性:总共有四个级别
- Read uncommitted(读未提交):最低级别,任何情况下都无法保证数据的安全性
- Read committed(读已提交):解决掉脏读现象
- Repeatable Read(可重复读):可以解决掉脏读、不可重复读现象
- Serializable(串行化):可以理解为锁表动作,可以解决以上所有的问题。