关于MYSQL事务不回滚问题

关于MYSQL事务不回滚的问题:

    实现功能时,发现MYSQL事务不回滚,查看表的引擎是InnoDB,但有可能数据库的不是,查看修改如下:

 

 

查看MySQL数据库使用的存储引擎:mysql>show variables like '%storage_engine%';结果:+----------------+--------+ |Variable_name |Value| +----------------+--------+ |storage_engine|InnoDB| +----------------+--------+ 

 

查看MySQL提供什么存储引擎:mysql>show engines;结果:+------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +------------+---------+----------------------------------------------------------------+--------------+------+------------+ | MyISAM | YES | Default engine as of MySQL 3.23 with great performance | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | +------------+---------+----------------------------------------------------------------+--------------+------+------------+ 8 rows in set
从结果上看,当前数据库的默认存储引擎是InnoDB(注意观察Support这一列的值),不过有的数据库却不是,它们默认的是MyISAM。非但如此,在Support一栏中还显示NO,就是说连InnoDB都不支持。这就是为什么不回滚的原因:InnoDB支持事务,而MyISAM不支持!其实MyISAM是MySQL默认的存储引擎,在安装MySQL时如果没有指定存储引擎,那么MySQL会默认使用MyISAM,因为它不支持事务,也许效率会比InnoDB高一些。
如果使用的是MyISAM,那么需要将其改为InnoDB,具体方法如下:1、打开“MySQL_HOME/my.ini”,找到[mysqld],在它的下面有一句话是“skip-innodb”,将其注释掉,即改为:#skip-innodb。2、在[mysqld]下加上一句“default_table_type=INNODB”(如果写成default-storage-engine=INNODB也可以,两者之间的区别我还没有研究过)3、重启MySQL服务(注意:是重启服务,不是光退出数据库就完事了!)4、再次执行mysql> show engines;可以看见默认存储引擎已经变成InnoDB了。5、原来已经存在的表,如果想使用事务,要修改它的存储引擎,在默认是InnoDB的情况下删除重建。当不想删除的时候,执行alter table 表名 ENGINE = InnoDB;之后执行show table status from 数据库名 where name='表名';可以查看表状态,看存储引擎是否被修改了。
在使用了InnoDB引擎之后,再次运行代码,回滚成功!

### 如何在 MySQL 中实现事务回滚MySQL 数据库中,可以通过 `ROLLBACK` 命令来撤销当前事务中的所有更改。这使得可以恢复到事务开始之前的状态[^1]。 #### 设置隔离级别并启动事务 为了确保数据的一致性和准确性,在执行任何可能影响多行记录的操作前,建议设置合适的事务隔离级别: ```sql SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION; ``` 上述命令设置了最严格的串行化隔离级别,并开启了新事务[^2]。 #### 执行查询语句 在此之后可安全地运行各种 DML (Data Manipulation Language) 操作,比如 SELECT ... FOR UPDATE 来锁定特定行防止其他会话修改它们: ```sql SELECT * FROM t1 FOR UPDATE; ``` #### 处理异常情况下的自动回滚 如果希望在遇到 SQL 错误或警告时自动触发回滚,则可以在存储过程内声明退出处理器: ```sql DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK; ``` 这些指令会在发生错误或警告的情况下立即终止程序流并将控制权返回给调用者的同时完成回滚操作[^4]。 #### 显式发出回滚命令 如果满足条件或者决定提交所做的变更,那么应该显式地调用 `ROLLBACK` : ```sql -- 当想保存所做的改变时使用此命令 ROLLBACK; ``` 值得注意的是,一旦发出了 `COMMIT` 或者 `ROLLBACK` ,就意味着结束了当前的事务;因此每次都需要重新开启一个新的事务才能继续进行后续的数据操纵活动[^3]。 #### Python 示例:通过 PyMySQL 库管理事务 下面是一个简单的例子展示了如何利用 Python 的PyMySQL库来进行数据库连接以及处理事务: ```python import pymysql.cursors connection = pymysql.connect( host='localhost', user='user', password='passwd', database='db', cursorclass=pymysql.cursors.DictCursor) try: with connection.cursor() as cursor: sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)" cursor.execute(sql, ('webmaster@python.org', 'very-secret')) # 提交更改 connection.commit() finally: connection.close() # 如果需要回滚则替换 commit() 方法为 rollback(): # connection.rollback() ``` 在这个脚本里,每当创建了新的游标对象时就会隐含地开始了新的一次事务。而无论是调用了 `commit()` 还是 `rollback()` 都意味着结束该事务并且释放资源以便下一次循环能够正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值