(1)原子性:事务是一组原子性的操作,这一组操作要么同时成功,要么同时失败,不会存在部分性成功和失败
(2)一致性:事务执行前和事务执行后,数据都是保持正确的形态
(3)隔离性:同时时间只允许一个事务对数据进行操作,不允许同时进行,但各个事务都可以正常运行,互不影响
(4)持久性:一旦事务完成对数据的改变是永久性的,不可更改的
2.查看数据库事务级别:
select @@tx_isolation; 默认为REPEATABLE-READ(可重复读)
3.事务的隔离级别分为:读未提交,读已提交,可重复读,串行化
4.事务隔离级别为read uncommitted(读未提交):
(1)可能出现问题:脏读
(2)问题描述:事务A读取了事务B未提交的数据,拿上读取的数据去做处理,但是它不知道,B由于某些原因,
进行了事务回滚,A读到的就会出现脏数据。
(3)解决办法:采用读提交的事务隔离级别
5.事务隔离级别为read committed(读已提交):
(1)虽然解决了脏读的现象,但是出现的不可重复读的问题,也就是俩次读到的数据不一致
(2)问题描述:事务A开始读取一条数据,此时事务B正在修改这条数据,但是事务B的事务未提交,
而由于我们的事务隔离级别是读已提交,所以事务A不到事务B未提交的数据,但是当事务B提交后,
事务A再去读的时候,读取的就是事务B修改提交后的数据,这样就造成了俩次读的数据不一致,即不可重复读
6.事务隔离级别为repeatable-read(可重复读)(1)数据库默认的事务隔离级别
(2)解决了脏读的问题,重复读问题
(3)可能出现幻读
(4)问题描述:事务A读取一条数据,此时事务B正在修改这条数据,但是事务B未提交,所以事务A不会看到事务B
的修改但未提交的数据(解决了脏读问题),当事务B执行commit后,事务A再次读这条数据时读到并不是事务B
修改提交后的数据(解决了重复读问题),事务B可以看到修改的数据,但当我们在事务A对这条数据进行修改时,
我们是对事务B修改提交后的数据进行修改的,而不是事务A看到的数据,保证了数据的一致性,还有一种特殊
情况就是事务B执行了插入一条数据并提交了事务,事务A正在坐sum的时候并没有把事务B新添加的数据算进去,
但是当事务A提交sum加上了事务B新添的数据,这就产生了幻读
(5)解决办法:串性化7.事务隔离界别为:serializable(串行化)
(1)解决幻读现象
(2)问题描述:事务A在执行查询时,事务B正在执行插入数据时,因为表被锁定了,所以插入失败,所以可以解决幻读
(3)缺点:这样做会使并发性将低,所以不推荐使用