事务的特性
数据库事务,即数据库执行的功能的过程,等同于操作系统当中的进程,为了让一个事务能够顺利准确的完成,需要实现四个准则
1.原子性
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,不可能停滞在中间环节。
2.一致性
一致性指一个事务执行之前和执行之后都必须处于一致性状态,比如A向B转账,不可能A扣了钱,B却没收到。
3.隔离性
同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
4.持久性
持久性是指一个事务对数据库中的数据的改变是永久性的,不能回滚。
事务存在的问题
1.脏读:一个事务处理过程里读取了另一个未提交的事务中的数据。
扫描二维码关注公众号,回复:
4775437 查看本文章
2.不可重复读:事务 A 读取一数据,事务 B 在事务A读取的过程中对数据作了更新,导致事务A多次读取数据时结果不一致。
3.虚读:事务 A 修改表数据,事务 B 在事务A修改的过程中插入一条新数据,导致事务A像是没有修改完一样。
解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
MySQL事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
读提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
serializable:通过给每个数据行与表上锁,强行让事务的处理序列化,可以解决三大问题但也会导致大量超时与锁竞争现象,故而不常用。
repeatable-read:开始读取数据(事务开启)时,不再允许修改操作,可以解决不可重复读问题但还存在幻读现象。
read-committed:就是一个事务要等另一个事务提交后才能读取数据,只能解决脏读问题。
read-uncommitted:没用,啥也干不了。
MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
在MySQL数据库中查看当前和设置事务的隔离级别:
select @@tx_isolation;
set [glogal | session] transaction isolation level 隔离级别名称;
set tx_isolation=’隔离级别名称;’