什么是事务
事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写。
1、原子性
即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换
2、一致性
事务的执行使得数据库从一种正确状态转换成另外一种正确状态
3、隔离性(对应四种隔离级别)
事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务
4、持久性
事务正确提交之后,其结果将永远保存在数据库之中
事务的作用
保证数据读写的同步性、准确性。使用案例:AOP事务管理 数据回滚
并发下事务会产生的问题(不同的事务同一时刻操作同一表格)
1、脏读
事务A读到了事务B还没有提交的数据
2、不可重复读
在一个事务里面读取了两次某个数据,读出来的数据不一致。
3、幻读
在一个事务里面的操作中发现了未被操作的数据
幻读出现的前提是并发的事务中有事务发生了插入、删除操作。
事务隔离级别
1、READ_UNCOMMITTED
读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
2、READ_COMMITED**
读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读
3、REPEATABLE_READ**
重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决
4、SERLALIZABLE**
串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了