MYSQL事务处理

363 阅读2分钟

什么叫事务?

开高级程序开发设计中,难免会有数据库的写入和输出,有些时候考虑到写入多个数据在其中一个业务内进行排查和修改,万一在逻辑下其中一行在数据或者逻辑报错,会导致之前写入的内容原封不动在数据库里面

这样子会导致,程序抛出异常,错误的数据完好无损保存到数据库.

事务简单来说,就是处理一件数据库事情
俗称数据库事务(Datebase Transaction)
是在程序设计内一段(单元)内容进行操作

事务的四大特性

  • 原子性(atomicity):一个事务内是完全独立,不可分割的

  • 隔离性(isoation):事务内容不能被其他事务被干扰

  • 一致性(consistenc):事务必须从一个一致性状态转为另外一个一致性

  • 持久性(durability):一个事务一旦提交,它的数据库的影响是永久的

Mysql事务处理

show engines; --查看数据库引擎
default-storage-engine = Innodb --my.ini修改引擎

在Mysql 5.2之后带Innodb数据库引擎数据才能使用事务处理 一般Mysql默认事务为自动提交(autocommit)

begin; --开启事务(START TANSACTION)
commit; --提交事务
rollback; --回滚事务

回到刚刚的程序设计逻辑里面
在数据写入前,事务改为手动提交(begin),如果业务逻辑中途出错,捕捉异常,然后吧数据回归到原始状态,如果没有任何问题,永久保存(commit),这样保证这段内容输入为正确的数据

事务带来的问题

事务能够给业务逻辑上一定写入安全,但是在数据上存在大量的并发风险

  • 并发风险一:脏读
    当其中两条线程同时对同一个表操作,对方拿到是尚未保存的脏数据
  • 并发风险二:不可重复读
    两个数据同时对一条数据进行操作和查看,一般会在库存删减上体现
  • 并发风险三:幻读
    两个线程同时对同一个表操作,导致内容预期不符合

事务隔离

为有效防止事务并发可能性发生,mysql在事务处理上添加了事务隔离
事务隔离情况如下

  • 读未提交 (read-uncommitted)
  • 读已提交(read-committed)
  • 可重复读(reapeatable-read)
  • 串行化(serializable)
select @@tx_isolation --mysql5查询级别
select @@transaction_isolation; --mysql8查询级别
set session transaction isolation level XXX
--设置会话级别

总结

有些时候事务能够给予安全的数据写入,但是也有弊端,所以一般都要善用数据库的时间处理,比如说服务器唯一支付回调接口才能操作数据,其他接口只能查看状态,但是支付接口会影响库存,呢只能在数据操作上为不可重复读,一般需要锁行