mysql数据库的存储引擎为INNODB的时候才支持事物,INNODB的锁机制是行级索,一般情况下语句的执行都会隐式的开启事物自动提交。执行update语句的时候会加行级锁【写锁也叫排它锁】,自动提交(commit)的时候锁被释放,所以当执行一条语句update语句的时候,这时候如果也有其他的update语句需要更新相同的行数据,则需要等前面的update更新完,锁释放,后面的update语句才会执行。
当开启一个事物的时候,自动提交(commit)被改为手动提交了,这个时候要执行update语句。例子:update test_table set `pwd`='123455' where id=56;那么这行数据(select * from test where id=56)会被加上行级锁【写锁,select * from test where id=56 for update】。如果事物没有结束【commit 或rollback】,那么这个条数据的索一直存在。这也是可能会出现死锁的原因。当事物结束的时候,锁也会被释放。
当连续开启多个事物的时候前面的事物会被自动提交
例子:begin;
update test0 set pwd='1' where id=56 ;
begin;
update test0 set pwd='2' where id=57 ;
同样一个事物开启后被执行了多次,前面执行的就会被提交。不知道为啥,但是我亲自试验过得到的结论。