若是一个包含多个步骤的业务操做,这些操做被事务管理,那么这些操做要么同时成功要么同时失败java
事务的四大特性(必须记住):
持久性:当事务回滚或者提交以后,数据库会持久化数据
一致性:事务操做先后,数据的总量不变
原子性:是不可分割的最小单位,不可分割,要么同时成功要么同时失败,不可分割
隔离性:各个事务之间相互独立mysql
开启事务:start transaction
回滚事务:Roolback
提交:commit;
事务提交的两种方式:
自动提交:
mysql中事务是默认自动提交的
好比咱们执行一条DML(Data Manipulation Language),他会自动提交数据,将数据持久化到数据库中
手动提交:
Oracle数据库默认是手动提交的,
须要开启事务再手动提交sql
查看事务提交的方式:
能够看到mysql的默认提交方式是自动提交,-- 1 表明自动提交 0 表明手动提交数据库
set @@autocommit安全
能够看到事务的提交方式被修改成手动提交blog
1
Read uncommitted:读未提交
产生的问题:脏读,不可重复读,幻读
2
Read commited:读已提交
产生问题:不可重复读,幻读
3
Repeatable read 可重复读(Mysql默认读法):
产生的问题:幻读
4
serialzable:串行化
能够解决全部问题图片
事务的隔离等级越高,安全等级也越高,可是效率愈来愈低
数据库查询隔离级别:
select @@tx_isolation
设置数据库的隔离等级:
select global transaction isolation level事务
不可重复读:
不可重复读是指A事务读取了B事务已经提交的更改数据。假如A在取款事务的过程当中,B往该帐户转帐100,A两次读取的余额发生不一致。ip
脏读:
A事务读取B事务还没有提交的更改数据,并在这个数据的基础上进行操做,这时候若是事务B回滚,那么A事务读到的数据是不被认可的。例如常见的取款事务和转帐事务:
好比你去隔壁老王那借钱,你在他家的的时候看到他给你转的钱到帐了,而后你就给他打了欠条,可是在你出了门,去银行取钱的时候,发现从老王 那借的钱人间蒸发了,由于老王使用了事务回滚,迷惑了你一番
it
幻读:
A事务读取B事务提交的新增数据,会引起幻读问题。幻读通常发生在计算统计数据的事务中,例如银行系统在同一个事务中两次统计存款帐户的总金额,在两次统计中,恰好新增了一个存款帐户,存入了100,这时候两次统计的总金额不一致。
以上就是java事务的一些基础知识,若有错误还请各位批评指正,喜欢个人文章能够关注或者收藏