什么是事务? \x0d\x0a\x0d\x0a事务是逻辑上的一组操作,组成这组操作的各个单元,要不全都成功要不全都失败,这个特性就是事务 \x0d\x0a\x0d\x0a注意:mysql数据支持事务,但是要求必须是innoDB存储引擎 \x0d\x0a\x0d\x0a解决这个问题: \x0d\x0a\x0d\x0amysql的事务解决这个问题,因为mysql的事务特性,要求这组操作,要不全都成功,要不全都失败,这样就避免了某个操作成功某个操作失败。利于数据的安全 \x0d\x0a\x0d\x0a如何使用: \x0d\x0a\x0d\x0a(1)在执行sql语句之前,我们要开启事务 start transaction; \x0d\x0a\x0d\x0a(2)正常执行我们的sql语句 \x0d\x0a\x0d\x0a(3)当sql语句执行完毕,存在两种情况: \x0d\x0a\x0d\x0a1,全都成功,我们要将sql语句对数据库造成的影响提交到数据库中,committ \x0d\x0a\x0d\x0a2,某些sql语句失败,我们执行rollback(回滚),将对数据库操作赶紧撤销 \x0d\x0a\x0d\x0a(注意:mysql数据支持事务,但是要求必须是innoDB存储引擎) \x0d\x0amysql create table bank(name varchar(20),money decimal(5,1))engine=innodb defau \x0d\x0alt charset=utf8; \x0d\x0a\x0d\x0amysql inset into bank values('shaotuo',1000),('laohu',5000); \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a\x0d\x0a------没有成功“回滚”执行rollback \x0d\x0amysql start transaction; //开启事务 \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set moey=money-500 where name='laohu'; \x0d\x0aERROR 1054 (42S22): Unknown column 'moey' in 'field list' \x0d\x0amysql rollback; //只要有一个不成功,执行rollback操作 \x0d\x0aQuery OK, 0 rows affected (0.01 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a------成功之后 进行commit操作 \x0d\x0amysql start transaction; //开启事务 \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.01 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set money=money-500 where name='laohu'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql commit; //两个都成功后执行commit(只要不执行commit,sql语句不会对真实的数据库造成影响) \x0d\x0aQuery OK, 0 rows affected (0.05 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1500.0 | \x0d\x0a| laohu | 4500.0 | \x0d\x0a+---------+--------+
成都创新互联长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为来宾企业提供专业的做网站、成都网站设计,来宾网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
ACID 是为保证事务(transaction)是正确可靠的,所必须具备的四个特性:
以 A 给 B 转账100元为例:
MySQL事务是由 InnoDB 存储引擎实现的。
可以用如下的命令显式的开启事务:
另外,在自动提交(autocommit)模式下,我们执行的每一条 SQL 语句都是一条独立的事务;如果关闭了自动提交(autocommit)模式,则所有的 SQL 语句都在一个事务中,直到执行了 commit 或 rollback,该事务结束,同时开始了另外一个事务。
MySQL 事务的 ACID 特性靠如下机制实现:
Go 语言的 Gorm 提供了对于事务操作的支持:
此外,还有嵌套事务以及手动事务等操作,可以参考中文文档: learnku.com/docs/gorm/v…
@Transactional 注解必须添加在public方法上,private、protected方法上是无效的。
一般情况下,推荐将@Transactional 注解加在方法上,因为@Transactional直接加在类或者接口上,@Transactional注解会对类或者接口里面所有的public方法都有效,会影响性能。
msql的一个事务的回归测试,可以自测一下,了解下事务。
举个例子:小明和小飞两个人现在手里各有¥100,突然小飞脑袋出问题了说给小明¥50,现在他们手里的钱就是(小明:¥150,小飞:¥50);这样同步就是一个事务的完成,下面是demo
/*
事务 ACID
原子性 Atomic
一致性 Consistency
隔离性 Isolation
持久性 Durability
*/
var mysql = require('mysql');
var connection = mysql.createConnection({
host:'localhost',
user:'root',
password:'',
database:'yudi'
});
connection.connect();
//开始一个事务
connection.beginTransaction(function(err){
if(err) throw err;
connection.query('update account1 set mny=0 where id=1',function(err,results){
if(err){
connection.rollback(function(){
throw err;
})
throw err;
}
connection.query('update account2 set mny=200 where id=1',function(err,results){
if(err){
//回滚一个事物
connection.rollback(function(){
throw err;
})
throw err;
}
//提交一个事物
connection.commit(function(err){
if(err){
connection.rollback(function(){
throw err;
})
throw err;
}
console.log('success');
});
});
});
})
事务就是指对数据库的多次修改,要么全部成功,要么全部失败,不能出现部分修改成功,部分修改失败的情况。
PHP下操作mysql数据库要实现事务提交,需注意以下方面:
1, 数据库表存储引擎类型设置为innoDB。默认的mysql表采用MYISAM引擎,是不支持事务的,因此要采用以下语句变更:
mysql alter table ‘table_name’ engine=innodb;
2,PDO对象设置要设置errmode为Exception,否则第16行SQL执行出错,语句也不会跳到catch段去rollback, 而是继续向下执行直到commit。
MYSQL 事务处理主要有两种方法
1、用 begin, rollback, commit 来实现
begin 或/ start transaction )开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
1.不管 autocommit 是1还是0
start transaction 后,只有当 commit 数据才会生效, rollback 后就会回滚。
2、当 autocommit 为 0 时
不管有没有 start transaction .
只有当 commit 数据才会生效, rollback 后就会回滚。
3、如果 autocommit 为1 ,并且没有 start transaction .
调用 rollback 是没有用的。因为事务已经自动提交了。
事务测试1
事务测试2
flag 相当一定义这个保存点的名字
savepoint flag : savepoint 允许在事务中创建一个保存点,一个事务中可以有多个savepoint ;
release savepoint flag :删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
rollback to flag :把事务回滚到标记点;
set transaction :用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有
READ UNCOMMITTED 、 READ COMMITTED 、 REPEATABLE READ 和 SERIALIZABLE
select @@transaction_isolation;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;