服务器的数据库具备四大特性,分别为原子性、一致性、隔离性、持久性。其中原子性指的事务所含的全部操作要么成功,要么全部失败回滚,事务的操作成功需要应用到数据库。如果操作失败不可以对数据库有任何影响;一致性要求事务执行前后数据库状态相同。事务执行中可能会出现多步骤,这些结果都需要满足数据库的约束和规则;隔离性上,是多用户访问时,数据库要为每个用户开启事务不能被其他事务操作干扰,多个并发事务相互隔离;持久性是事务提交后数据库中的数据改变是永久的,即便是在数据库系统中遇到故障情况下也不会丢失掉提交事务的行为。
数据库的事务隔离性中,多线程开启事务操作数据库中数据,数据库系统要能进行隔离操作保证其准确性。一旦忽视隔离性,可能出现意外问题。如脏读,指的在一个事务过程中读取到了另外一个未提交事务的数据。一个事务多次修改某些数据但是这个事务中多次修改未提交,同时并发事务发出访问数据的时候就会出现两个事务数据不一致。如A向B的财务交易记录:
update account set money=money+100 where name=’B’; (此时A通知B)
update account set money=money - 100 where name=’A’;
执行第一条SQL时,A会通知B查看账户,而后第二天SQL执行时,只要事务未提交就会出现全部操作回滚情况B会看到账户没有收到A所说的交易到账情况。
不可重复读是指在数据库中数据具有这个特征,一个事务范围中多次查询结果却不一致。可能因查询间隔问题导致被另外一个事务修改且提交。不可重复读和脏读存在差异,脏读是一事务读取另外一事务还没有提交的脏数据,不可重复读是读取前一事务提交的数据。还可能出现幻读,这是一种非独立执行发生的现象,幻读和不可重复读都是读取了另外一条已提交的事务,差异就是不可重复读查询属于同一个数据项,幻读是对于一批完整数据,如数据的个数等。
事务开始:
start transaction; # 开启事务
事务结束:
commit;或者rollback; # 事务结束
开启事务前,设置数据库隔离级别,查看和提交状态命令:
show variables like '%auto%';
取消自动提交:
set autocommit = 0;
查询隔离级别:
set session transaction isolation level ; # 8.x
set session transaction isolation ; # 5.x
开启事务,只要执行一条SQL就是开启事务(可选):
start transaction