应用场景:
银行取钱,从ATM机取钱,分为以下几个步骤
1 登陆ATM机,输入密码;
2 连接数据库,验证密码;
3 验证成功,获得用户信息,比如存款余额等;
4 用户输入需要取款的金额,按下确认键;
5 从后台数据库中减掉用户账户上的对应金额;
6 ATM吐出钱;
7 用户把钱拿走。
对于上面的取钱这个事情,如果有一步出现错误的话,那么就会取消整个取钱的动作,但是如果在第5步,系统后台已经把钱减了,但是ATM机没有取出来,那么就应用到mysql中的事务。简单地
来说,就是取钱这7步要么都完成,要么就啥也不做,在数据库中就是这个道理。

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销,在事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作。回滚的意思其实即使如果之前是插入操作的话,那么会执行删除之前插入的记录,如果是修改操作的话,那么会执行将update之前的记录还原。因此,正确的原子操作是真正被执行过的,是物理执行。

事务是由一条或者多条sql语句组成,在事务的操作中,要么这些sql语句都执行,要么都不执行。

事务的ACID特性:原子性,一致性,隔离性,持久性。

在当前事务中确实能看到插入的记录,最后只不过被删除了,但是auto_increament不会删除而是改变值。

为什么auto_increament没有回滚:因为innodb存储引擎中的auto_increment就是主键的计数记录的当前值是保存在内存中,并不是存在磁盘中的,当mysql server处于运行的时候,这个计数值只会随着
insert增长,不会随着delete减少。而当mysql server启动的时候,当我们需要查询auto_increment计数值时,mysql便会自动执行:SELECT MIX(ID) FROM 表名 FOR UPDATE;这条语句来获得auto_increment
列的最大值,然后将这个值放到auto_increment计数器中,所以ROLLBACK MYSQL的auto_increment计数器也不会做负运算

事务分为哪些种:扁平事务,带有保存点扁平事务,链事务,嵌套事务,分布式事务。

MYSQL中使用事务:

在MYSQL命令行命令下事务都是自动提交的,即执行Sql语句就会马上执行COMMIT操作。因此要显示一个事务的开启必须使用命令BEGIN或者START TRANSACTION,或者执行命令SET AUTOCOMMIT=0来
禁止当前回话的自动提交

事务控制语句:

BEGIN/START TRANSACTION:显示地开启一个事务
COMMIT:也可以使用COMMIT WORK 两者是等价的。COMMIT会提交事务,并是已对数据库进行的所有的修改是永久性的。
ROLLBACK:也可以使用ROLLBACK WORK,两者也是等价的,回滚会结束用户的事务,并且会撤销正在进行的所有未提交的修改。
SAVEPOINT identifier:允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT
release SAVEPOINT identifier:删除一个事务的保存点,当没有制定的保存点,会抛出一个异常。
SET TRANSACTION:用来设置事务的隔离级别。Innodb存储引擎提供的事务隔离级别有READ UNCOMMITED,READ COMMITED,REPEATABLE READ和SERIALIZABLE.

事务的隔离级别:

在数据库操作中,为了保证并发读取数据的正确性,提出了隔离级别,区别如下:
隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读 read uncommited 可能 可能 可能
已提交读 read commited 不可能 可能 可能
可重复读 repeatable read 不可能 不可能 可能
可串行化 serializable 不可能 不可能 不可能

:一个事务读取到了另一个事务没有提交的数据
例如:事务T1更新了一行记录的内容,但是并没有提交所做的修改。事务T2读取到了T1更新后的行,然后T1执行回滚操作,取消了刚才所做的修改。现在T2所读取的行就无效了

不可重复读

:在同一事务中,两次读取同一数据,得到的内容不同
例如:事务T1读取一行记录,紧接着事务T2修改了T1刚才读取的那一行记录。然后T1又再次读取这行记录,发现与刚才读取的结果不同。这就称为“不可重复”读,因为T1原来读取的那行记录已经发生了变化

:在同一事务中,用同样的操作读取两次,得到的记录数不同
例如:事务T1读取一条指定的WHERE子句所返回的结果集。然后事务T2新插入 一行记录,这行记录恰好可以满足T1所使用的查询条件中的WHERE子句的条件。然后T1又使用相同的查询再次对表进行检索,
但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突然出现的一样

隔离级别越低,事务请求的琐越少或者说是保持琐的时间越短,Innodb存储引擎默认支持的隔离界别是REPEATALE READ;在这种默认的事务隔离级别下已经能完全保证事务的隔离性。

mysql事务回滚怎样实现的代码可以参考此bolg:http://bbs.csdn.net/topics/390876901

要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,
而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。

原文链接:https://blog.csdn.net/aschulianwuyanzu/article/details/77879727

1、如果事务中所有sql语句执行正确则需要自己手动提交commit;否则有任何一条执行错误,需要自己提交一条rollback,这时会回滚所有操作,而不是commit会给你自动判断和回滚。

2、新开一个事务会将该连接中的其他未提交的事务提交,相当于commit!

3、事务既没有提交也没有回滚时连接断开数据库会自动回滚

4、事务中,update语句如果没有commit的话,你再重新执行update语句,就会等待锁定,当等待时间过长的时候,就会报ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction的错误。

应用场景:银行取钱,从ATM机取钱,分为以下几个步骤1 登陆ATM机,输入密码;2 连接数据库,验证密码;3 验证成功,获得用户信息,比如存款余额等;4 用户输入需要取款的金额,按下确认键;5 从后台数据库中减掉用户账户上的对应金额;6 ATM吐出钱;7 用户把钱拿走。对于上面的取钱这个事情,如果有一步出现错误的话,那么就会取消整个取钱的动作,但是如果在第5步,系统后台已经把钱减了,但是ATM机没有取出来,那么就应用到mysql中的事务。简单地来说,就是取钱这7步要么都完成,要么就啥也不 某一句执行完成后,后悔了想要重新执行 遇到上述问题,能够时光倒流和吃后悔药吗? MySQL的Innodb引擎,为我们提供了事务功能,事务通过rollback和commit来操作。 1 配置/开始事务 1.1 配置事务 MySQL客户端shell... 有 数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句; 数据操作语言(DML),例如:INSERT、UPDATE、DELETE、SELECT语句; 数据控制语言(DCL),例如: COMMIT、ROLLBACK、GRANT、REVOKE等语句 2、COMMIT:提交事务 2.1、查看事务状态: select @@autocommit; show variables like ‘%autocommit%’; 1或者ON表示自动提交;0或者OFF表示手动提交:..
MySQL,COMMIT和回滚是两种常用的事务处理方式。COMMIT用于事务处理的提交,它将一个执行事务提交到数据库,并作为一个独立的单元进行处理。一旦提交,被修改的数据就会永久保存在数据库。 相反,回滚操作是将事务的所有操作全部撤销,以便保持数据库的一致性。在回滚事务,任何已经被修改过的数据都会被还原到最初的状态,即回滚前的状态。 因此,COMMIT和回滚的主要区别在于它们的效果。COMMIT会永久性地保存事务,而回滚会完全撤销事务,恢复到操作之前的状态。