开启事物:当开启事物之后,数据只会在临时表修改,如果不提交,那么关闭窗口之后,事物就会自动回滚
START TRANSACTION;
如果发现错误,执行回滚,就不会讲数据提交给正式表
ROLLBACK;
如果没有错误,那么就提交数据
COMMIT;
---------------------------
在mysql中一条语句会自动提交
为1代表自动提交

image.png
---将参数改为0,就是一条语句不默认提交,除非commit
set @@autocommit=0;
ps:mysql是自动提交一条语句,而Oracle是手动提交一条语句
事物的四大特征
1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
2.持久性:如果事物一旦提价或者回滚,数据库会持久化的保存数据
3.隔离性:多个事物之间相互独立
4.一致性:事物操作前后,数据总量不变
事物的隔离级别
//多个事物操作同一批数据可能引发的问题
1.脏读:一个事物读取到另一个事物中没有提交的事物
2.不可重复读(虚读):在同一个事物中,两次读取到的数据不一样
3.幻读:一个事物操作(DML)数据表中所有记录,另一个事物添加了一条数据,则第一个事物查询不到自己的修改
事物的隔离级别:安全性越来越高,效率越来越低
1.read uncommitted:读未提交的
产生的问题:脏读,不可重复读,幻读
2.read committed:读已提交的(oracle默认)
产生的问题:不可重复读,幻读
3.repeatable read:可重复读(mysql默认)
产生的问题:幻读
为什么会产生不可重复读问题?
当两个窗口设置为read committed的时候,第一个窗口开启了事
务,然后修改数据但是未提交,
这个时候,第二个窗口查询的是原来的数据,然后第一个窗口提交数据,第
二个窗口再次查询数据,查询到的是修改后的数据,
这样两次查询出来的数据就不一样,所以就叫不可重复读!
当设置为可重复读之后,两个窗口都开启事物,第一个窗口修改数据
但是未提交,第二个窗口查询数据也未提交,这个时候查询的是未修改的数
据,然后第一个窗口提交数据,但是第二个窗口再次查询数据,仍然未提交
事务,这个时候查询的仍然是未修改的数据,这样第二个窗口两次查询到的
都是未修改的数据,数据保持一致,这就叫可重复读!当把第二个窗口的
事务提交之后,再次查询才能够查询到提交之后的数据
4.serializable:串行化
可以解决所有的问题
当第一个事物操作这张表,它会锁住这张表,不让另外的事务访问,这
个事物会一直暂停在这里,除非第一个事物提交或者回滚
数据库查询隔离级别
select @@tx_isolation;
数据库设置隔离级别,必须关闭当前窗口之后才会生效
set global transaction isolation level 级别字符串;