1、含义
一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行
2、特点(ACID)
原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
一致性:一个事务的执行不能破坏数据库数据的完整性和一致性
隔离性:一个事务不受其它事务的干扰,多个事务是互相隔离的
持久性:一个事务一旦提交了,则永久的持久化到本地
3、分类
隐式事务:没有明显的开启和结束,本身就是一条事务可以自动提交,比如insert、update、delete
显式事务:具有明显的开启和结束,例如以下格式:
4、事务并发(读问题)
4.1、事物的并发问题如何发生?
多个事务同时操作同一个数据库的相同数据时
4.2、事务的并发问题都有哪些?
脏读:一个事务读到了另一个事务还未提交的update数据,导致多次查询的结果不一样
不可重复读:一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致
幻读:一个事务读到了另一个事务已经提交的insert数据,导致多次查询的结果不一样
4.3、事物的并发问题如何解决?
通过设置隔离级别来解决并发问题
4.4、隔离级别
![](https://img-blog.csdnimg.cn/cf0d3832308a4267a0d89653fce151c6.png)
4.5、注意问题
mysql 中默认第三个隔离级别 REPEATABLE READ
oracle中默认第二个隔离级别 READ COMMITTED查看隔离级别 SELECT @@tx_isolation;
设置隔离级别 SET SESSION|GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
5、丢失更新(写问题)
5.1、定义
在事务的隔离级别内容中,能够了解到两个不同的事务在并发的时候可能会发生数据的影响。细心的话可以发现事务隔离级别章节中,脏读、不可重复读、幻读三个问题都是由事务A对数据进行修改、增加,事务B总是在做读操作。如果两事务都在对数据进行修改则会导致另外的问题:丢失更新。
5.2、解决
悲观锁:认为两个事务更新操作一定会发生丢失更新
解决:通过在语句后边添加for update来实现行级上锁,所以又称为“行级锁”,例如:select * from t_account t wheret.id=‘1’ for update;
乐观锁:认为事务不一定会产生丢失更新,让事务进行并发修改,不对事务进行锁定
解决:由程序员自己解决,可以通过给数据表添加自增的version字段或时间戳timestamp,进行数据修改时,数据库会检测version字段或者时间戳是否与原来的一致,若不一致,抛出异常或者重新查询。
5.3、注意
对于账户交易建议直接使用悲观锁,数据库的性能很高,并发度不是很高的场景两者性能没有太大差别。如果是交易减库存的操作可以考虑乐观锁,保证并发度。