2014-02-17 107 views
0

我正在从事在线交易项目。
我在表t1(innoDB引擎)上插入一行,插入事件后有一个触发器。
在触发器中,我使用同一个表中的select语句获取数据,如“SELECT * FROM t1 WHERE ID = NEW.ID”。
它完美的工作2-3个月。但现在它给死锁问题。
它背后的原因是什么?
是否有可能多个线程同时访问同一个表上的同一个操作?
MySQL死锁问题

+0

你可以发布您收到的确切的错误? – dethtron5000

+0

org.springframework.dao.DeadlockLoserDataAccessException:PreparedStatementCallback; SQL [INSERT INTO t1(ID,NAME,ADDRESS)VALUES(?,?,?)]; 尝试锁定时发现死锁;尝试重新启动事务;嵌套异常是com.mysql.jdbc.exceptions.MySQLTransactionRollbackException:尝试获取锁定时发现的死锁;尝试在org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:300)重新启动事务 –

回答

0

你想要以前插入的ID吗?

,你可以尝试这样的事情

INSERT INTO table1 (title,userid) VALUES ('test', 1); 
SET @last_id_in_table1 = LAST_INSERT_ID(); 
+0

如果我在触发器中添加New.ID,那么它工作正常。但我使用选择查询,如“SELECT * FROM t1 WHERE ID = NEW.ID”,那么它给我的死锁问题是什么原因背后呢?为什么它的工作完美3个月,并突然给死锁错误? –

+0

我不知道确切的,但可能是你没有建立你的函数线程安全,所以这是被称为同时。 pl。尝试使db函数/ java代码线程安全 –